我开始使用node.js和mongodb并创建了一个小测试应用程序,它应该将传入的UDP数据包的有效负载插入到mongodb中。我在OS X 10.8.4上运行它,并通过MacPorts安装了mongodb @2.4.5_0 (active)
。
stack.coffee
dgram = require 'dgram'
mongo = require 'mongoskin'
dbopts = database: 'stacktest', safe: true, vvv:true
db = mongo.db('mongo://localhost/?auto_reconnect=true', dbopts)
db.bind('foo')
server = dgram.createSocket('udp4')
server.on "message", (buffer, rinfo) ->
res = db.foo.insert(buffer.toString(), (err) -> if err? then console.log(err) )
server.on "listening", ->
address = server.address()
console.log("UDP server listening " +
address.address + ":" + address.port)
# listen for UDP packets on port 30000
server.bind(30000)
使用coffee stack.coffee
运行此代码并从另一个终端echo "Hello" | nc -w 1 -u localhost 30000
向其发送消息正常工作,使用mongo
您将看到保存的消息:
> use stacktest
switched to db stacktest
> db.foo.find()
{ "_id" : ObjectId("520b09cc43ce0ade3601fa0a"), "0" : "H", "1" : "e", "2" : "l", "3" : "l", "4" : "o", "5" : "\n" }
但是,在某些情况下,并且看似随机,插入将无声地失败。消息进来,被上面的代码拿起但数据包从未显示(我用一个发送时间戳的小脚本测试)。在一个新的会话中,它将正确地保存两个,也许四个数据包,然后静默地停止工作(即,err
回调永远不会被调用)。重新启动新会话可能修复它,但并非总是如此。
请注意,我使用的是安全:true dbopts
,所以我想我应该收到有关实际错误的通知。
最糟糕的是,它现在似乎没有任何明显的原因而自行解决,这增加了我将如何松动插入物的困惑和担忧。
任何想法或指示?谢谢!