Node.jscallback混乱 – MongoDB的findOne()的第三个参数:为什么这是允许的?

我很困惑JavaScriptcallback。 我不明白他们的逻辑和他们为什么工作。 下面的代码是正确的,但是怎么可能呢?

app.get('db').collection("foo").findOne({ bar: req.query.baz }, { _id: 0 }, (err, doc) => { if (err) { res.json({ status: 503, message: "DB fault" }); return; } res.json({ status: 200, qux: doc }); }); 

这是MongoDB的findOne()的定义:

db.collection.findOne(查询,投影)

但在上面的代码中,超过两个parameter passing,所以我会期望一个错误。

这是MongoDB的findOne()的定义:

db.collection.findOne(查询,投影)

不,这是文档 – 可能来自shell命令的文档。 如果您查看实际使用的Node.js驱动程序的API参考 ,则会findlogging的callback参数。

额外的参数永远不会在JavaScript中引发错误。 同样在像C这样的语言中,他们最多只会产生编译时错误。 这是非常自然的行为,你正在使用错误的文档。 正确的是这里

 findOne(query, options, callback) -> {Promise} 

由于API支持Promises,所以实际上可以通过链接一个使用现代JavaScriptasynchronous/等待来省略callback

 const value = await findOne(query, options) 

该API有很多差异。 例如,你也可以像在Python中那样asynchronous地调用Cursor的迭代器。 然而,logging的方式是最古老的,也可能是最快的做事方式。