发送 res.status.send()

问题描述

我的代码中有以下内容。我试图阻止用户对某人进行两次审查,因此它应该停止执行 IF 语句中的代码并结束 firebase 调用

但是,它会继续执行其余的“.then”语句。我尝试将其更改为 end() 但这也不起作用。我做错了什么?

exports.reviewUser = (req,res) => {
  db.collection("users")
    .doc("user")
    .get()
    .then((doc) => {
      if (doc.exists) {
        return res
          .status(400)
          .json({ error: "You cannot review someone twice." })
          .send();
      }
    })
    .then(() => {
      //Additional functions
    })
    .then(() => {
      //Additional functions
    })
}

更新:

我遵循了答案,这是我编辑过的代码,以供将来参考。

exports.reviewUser = async(req,res) => {
    let existingReview = await checkReviewExists(userid);

    if (existingReview) {
       return res
        .status(400)
        .json({ error: "You cannot review someone twice." })
        .end();
     }

    db.collection("users")
      .doc("user")
      .then(() => {
      //Additional functions
    })
    .then(() => {
      //Additional functions
    })
}

function checkReviewExists(id1) {
  return db
   db.collection("users")
    .doc(id1)
    .get()
    .then((doc) => {
      if (doc.exists) {
        console.log("cannot review twice");
        return true;
      } 
      else 
         return false;
    });
}

解决方法

根据 Firebase 文档,我们可以使用 send(),redirect(),or end() 结束 HTTP 函数。但是,在您的情况下,您正在使用多个 Promise 解析 Firestore .then()。所以在这里,虽然第一个返回,但它转到第二个 then()

它叫做Promises chaining

上述参考提供了详细信息和示例。我更喜欢使用一个 .then() 或者只是 async / await 来完成这项工作。