我从 node.js 和 mongodb 开始,并创建了一个小型测试应用程序,它应该将传入的 UDP 数据包的有效负载插入到 mongodb 中。我在mongodb @2.4.5_0 (active)
通过 MacPorts 安装的 OS X 10.8.4 上运行它。
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
回调也从未被调用过)。重新启动新会话可能会修复它,但并非总是如此。
请注意,我使用的是 safe: true as dbopts
,所以我认为我应该收到有关实际错误的通知。
最糟糕的是,它现在似乎在没有任何明显原因的情况下自行修复,这增加了我会如何松动插入物的困惑和担忧。
任何想法或指示?谢谢!