1

我从 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,所以我认为我应该收到有关实际错误的通知。

最糟糕的是,它现在似乎在没有任何明显原因的情况下自行修复,这增加了我会如何松动插入物的困惑和担忧。

任何想法或指示?谢谢!

4

0 回答 0