我对JavaScript回调感到困惑。我不了解他们的逻辑以及他们为什么工作。以下代码是正确的,但它怎么可能?
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(查询,投影)
但是在上面的代码中,传递了两个以上的参数,所以我预计会出错。
答案 0 :(得分:1)
额外参数永远不会在JavaScript中引发错误。同样在C语言中,它们最多只会产生编译时错误。这是完全自然的行为,你使用了错误的文档。正确的是here
findOne(query, options, callback) -> {Promise}
由于API支持Promises,你实际上可以通过链接使用现代JavaScripts async / await
来省略回调。const value = await findOne(query, options)
该API存在许多差异。例如。您也可以像在Python中一样异步调用Cursor的迭代器。然而,记录的方式是最古老的,也可能是最快的做事方式。
答案 1 :(得分:0)
这是MongoDB的findOne()的定义:
db.collection.findOne(查询,投影)
不,那是文档 - 可能来自the one for the shell commands。如果您查看实际使用的API reference of the Node.js driver,您会发现记录了回调参数。