nodejs 处理 promisses 中的回调

nodejs handling callbacks in promisses

提问人:souradeep majumdar 提问时间:9/9/2023 最后编辑:souradeep majumdar 更新时间:9/9/2023 访问量:31

问:

我正在绑定 node.js,但无法理解为什么一个有效而另一个无效

你能给我解释一下为什么吗 这工作原理:

 app.delete('/notes/:id', (req, res) => {
        const id = req.params.id;
        const details = { '_id': new ObjectID(id) };
        db.collection('note')
        .deleteOne(details)
        .then((result) => res.send(result))
        .catch((err) => {
          !error.logged && logger.error('Mongo error', err);
          error.logged = true;
          throw err;
        });
      });

但这永远不会进入回调函数并卡在 deleteOne 中,但在 db 中我们看到条目被删除

app.delete('/notes/:id', (req, res) => {
        const id = req.params.id;
        const details = { '_id': new ObjectID(id) };
        db.collection('note').deleteOne(details, (err, item) => {
          if (err) {
            res.send({'error':'An error has occurred'});
          } else {
            res.send('Note ' + id + ' deleted!');
          } 
        });

还有我看到的所有示例,他们说下面的代码应该可以工作,但它从不进入回调,它确实建立了我可以在数据库日志中看到的数据库连接

var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";
console.log("hello");
MongoClient.connect(url, function(err, db) {
  if (err) throw err;
  var dbo = db.db("mydb");
  var myobj = { name: "Company Inc", address: "Highway 37" };
  dbo.collection("customers").insertOne(myobj, function(err, res) {
    if (err) throw err;
    console.log("1 document inserted");
    db.close();
  });
}); 
console.log("bye");

我在这里到底缺少什么,或者我的系统有问题?

下面是一个非常简单的 ChatGPT 回调示例

const fs = require('fs');

// Function to read a file asynchronously and invoke a callback when done
function readFileAsync(filePath, callback) {
  fs.readFile(filePath, 'utf8', (err, data) => {
    if (err) {
      callback(err, null); // Pass the error to the callback
    } else {
      callback(null, data); // Pass the data to the callback
    }
  });
}

// Example usage of the readFileAsync function
const filePath = 'example.txt';

readFileAsync(filePath, (err, data) => {
  if (err) {
    console.error('Error reading the file:', err);
  } else {
    console.log('File content:', data);
  }
});

为什么内置回调不起作用?

node.js mongoDB promise 回调

评论

0赞 danh 9/9/2023
我很惊讶一个有效,但另一个不行。我认为mongo函数在发送回调时会调用回调。如果没有回调,则返回一个 promise。两者之间最明显的区别是,第一个版本发送 deleteOne 结果作为响应;第二个版本发送一个字符串。我的建议是仔细检查是否输入了回调。
0赞 souradeep majumdar 9/9/2023
@danh你的意思是放置一个调试器,看看它是否在该代码块中?如果是这样,我已经尝试过了,但它没有进入

答:

1赞 trincot 9/9/2023 #1

这是 MongoDB API 版本 5.x+ 中的预期行为。

请参阅 MongoDB 文档:升级驱动程序版本:

版本 5.x 重大更改

  • 驱动程序删除了对回调的支持,转而支持基于 promise 的 API。

此更改已在 4.10 版本发布时宣布:

回调弃用

回调现在已被弃用,取而代之的是 Promises。回调将在下一个主要版本中删除。

评论

0赞 souradeep majumdar 9/9/2023
是的找到了一样的,谢谢:)
0赞 trincot 9/9/2023
您只能将一个答案标记为已接受,-)
1赞 Quentin 9/9/2023 #2

这与 Node.js 无关,而与 MongoDB 驱动程序有关。

请参阅文档

驱动程序删除了对回调的支持,转而支持基于 promise 的 API。

你说你看到的示例,显示回调方法有效,是旧的和过时的。当第三方教程不起作用时,您应该查看官方文档。

评论

0赞 souradeep majumdar 9/9/2023
是的找到了一样的,谢谢:)
0赞 souradeep majumdar 9/9/2023 #3

我的“mongodb”: “^6.0.0” 和 MongoDB 已从此文档中删除了 5.0.0 的回调 mongo 发布文档,得出的结论是这就是对数据库的回调不起作用的原因。如果有人有其他原因,请分享