即使没有错误,Promise 也会被拒绝。 Node.js

Promise gets rejected even though there is no error. NodeJs

所以,我有一段使用 Promises 的代码,我正在使用 bluebird 库。

问题是即使没有错误,我的承诺也会被拒绝。即使是简单的 console.log

,它也会完全跳过 .then

下面是使用 promise 的代码:

function returnMeetings(query) {
  return new Promise((reject, resolve) => {
    Meeting.find(query, (err, foundMeetings) => {
      if (err) {
           console.log("We have a error")
        reject(err);
      }
      resolve(foundMeetings);
    })
  })
}

下面是使用 returnMeetings 函数的代码

returnMeetings(query)
    .then((data) => {
    console.log("here we are")
    // while (count < stopAt) {
    //   let localData = [];
    //   if (req.params.duration === 'monthly') {
    //     let {
    //       date1,
    //       date2
    //     } = twoDates(count, count);
    //     localData = data.filter((el) => {
    //       if (el.startDate) {
    //         let localDate = new Date(el.startDate);
    //         if (localDate >= date1 && localDate <= date2) {
    //           return el;
    //         }
    //       }
    //     })
    //     if (localData) {
    //       data.push({
    //         data: localData,
    //         month: count
    //       })
    //     }
    //
    //     if (count === stopAt - 1) {
    //       myEmitter.emit('found all meetings')
    //     } else {
    //       count++;
    //     }
    //   }
    // }
  }).catch((err) => {
    res.status(500).json({
      message: err
    })
  })

正如您在 returnMeetings 函数中看到的那样,我在 if(err) 块中放置了一个 console.log,但它从未运行过,因此我得出结论,我没有收到来自 mongoose 查询的任何错误。

仍然,代码完全跳过了 .then 块,落入了 catch 链。我在 then 块内有一个简单的 console.log ,需要注意的一件有趣的事情是 catch 块内的回调中 err 的值是 [= 的数组42=] 文档。

谁能解释一下,为什么我的代码会以这种方式运行?

感谢您的帮助。

你的 Promise 构造函数回调中 resolve/reject 的顺序是错误的......函数的名称无关紧要,第一个是 resolve,第二个是 reject ...你实际上是在拒绝打电话时承诺 resolve

即你可以

  return new Promise((fred, wilma) => {

然后要解决承诺,您将调用 fred(value) 并拒绝您将调用 wilma(error)

换句话说,你给回调参数的名字是无关紧要的,位置是相关的

按如下方式更改您的代码:

function returnMeetings(query) {
  return new Promise((resolve, reject) => {
    Meeting.find(query, (err, foundMeetings) => {
      if (err) {
           console.log("We have a error")
        reject(err);
      }
      resolve(foundMeetings);
    })
  })
}