微妙的坑 - 1

September 2, 2014

只是记录一下在项目里遇到的坑,这次的几个坑都是因为nlpir造成的。

项目里用到LDAP,其中有这么一段:

filter = Net::LDAP::Filter.eq("sAMAccountName", user_name)
info = ldap.search(base: "dc=test, dc=cn", filter: filter)

在命令行里单独测试运行正常,但是放在Rails的一个控制器里调用,就会在ldap.search那行出现这个错误:

ArgumentError (wrong number of arguments (0 for 1..2)):
  app/controllers/ldap_controller.rb:17:in `ldap_auth'
  ...

Stacktrace更是诡异,都到fiddle去了:

/home/mga/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/fiddle/import.rb:236:in `create_value'
net-ldap (0.7.0) lib/net/ldap.rb:1536:in `block (2 levels) in search'
net-ldap (0.7.0) lib/net/ldap.rb:1532:in `each'
net-ldap (0.7.0) lib/net/ldap.rb:1532:in `block in search'
net-ldap (0.7.0) lib/net/ldap.rb:1447:in `loop'
net-ldap (0.7.0) lib/net/ldap.rb:1447:in `search'
net-ldap (0.7.0) lib/net/ldap.rb:654:in `search'
...

压力山大啊,然后我尝试捕获异常,发现到ldap.search能拿到结果,只是最后返回值的时候才出异常,于是有了这个解决方法:

filter = Net::LDAP::Filter.eq("sAMAccountName", user_name)
info = nil
begin
  ldap.search(base: "dc=pv, dc=do", filter: filter, return_result: false) do |entry|
    info = entry
    break
  end
rescue
end

折腾我了一个下午。

后来用[1..-1]来取ActiveRecord结果集中第二到最后的元素,居然出现StackOverflow,再试发现只要取下标都会出错,感觉不妙,一定是某个库导入了奇怪的东西。然后一个一个gem关掉,才定位到nlpir, 打开其中主要的一个文件, 开头是这样的:

# coding: utf-8
...
include Fiddle::CParser
include Fiddle::Importer

module Nlpir
  ...
end

直接在顶层include Fiddle::ImporterFiddle::Importer刚好又定义了[]……

Mixin用错了就和动态作用域一样坑。