我在AWS EC2实例上运行了NodeJS服务器和MongoDB。我已经复制了这个实例并启动了另一个实例,但代码的行为现在已经不同了。行为的意思如下:我使用NodeJS异步库,我有以下代码片段:
async.waterfall([
function(cb) {
db.collection.remove(query, cb);
},
function(result, cb) {
func_foo(result, cb);
},
...
在新实例上,我在func_foo中遇到错误,说明'cb'不是回调函数。上面的代码在第一个EC2实例(基于linux)和专用的基于Win7的Node / Mongo机器上运行良好。在挖掘了一些之后,我发现,由于某种原因,db.colleciton.remove返回2个参数,而不是1,就像在其他机器上一样,所以现在,'cb'是第二个参数,这是不是功能;因此错误。
我总是可以将函数(result,cb)修改为函数(result1,result2,cb)类型代码,然后在里面检查result2是否是函数,如果是,则将其用作回调函数。但我担心我可能在其他地方有类似的问题,我真的不想改变在其他机器上工作的代码。
所以,我的第一个问题是:在启动时是否有任何标志/启用mongo可能会导致db.collection.remove()调用的不同行为。我使用以下命令启动mongo守护程序:'sudo / usr / bin / mongod -f /etc/mongod.conf'。我不记得我是如何在第一个EC2实例上开始的(它是在6个月前)。但是两个实例上的mongod.conf文件是相同的,因为第二个实例是第一个实例的复制副本。
第二个问题更为笼统:处理函数的最佳方法是什么,有时返回一个参数,有时返回两个。我用MongoDB NodeJS驱动程序遇到了这种现象。除了查看源代码之外,如何判断函数将返回多少个参数。文档只提到了一个论点。
谢谢你, 加里
答案 0 :(得分:0)
在深入了解NodeJS Mongo驱动程序和Mongo在线文档之后,我发现了问题所在,并希望与其他人分享。
Mongo处理从2.4.x版到2.6.x版的插入/更新/删除操作的方式发生了变化。在我原来的EC实例上,我一直在运行2.4.x版本,新实例已更新为2.6.x版本。
在2.4.x版本中,例如,delete命令将返回已删除的项目数。如果用户想要检查错误,可以调用getLastError命令。在2.6.x版本中,delete命令返回已删除的项目数和getLastError命令的输出。实际效果是,现在delete命令返回2个值,而不是ver 2.4.x中的一个
我的原始EC2实例已将Mongo更新为2.6.x,但服务器尚未重新启动,因此它仍在运行2.4.x。
我现在需要决定是否应该只加载2.4.x版本或重写我的代码以支持2.6.x的新要求。