Node.js回调混乱 - MongoDB的第三个参数findOne():为什么允许这样做?

时间:2017-10-12 22:22:22

标签: javascript node.js callback

我对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(查询,投影)

但是在上面的代码中,传递了两个以上的参数,所以我预计会出错。

2 个答案:

答案 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,您会发现记录了回调参数。