微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

QuerySnapshot.empty 导致承诺拒绝错误

如何解决QuerySnapshot.empty 导致承诺拒绝错误

我有一个使用 firebase-admin 和 express 的后端,允许从客户端向服务器发送请求,以更改我拥有的包含用户数据等内容的 Firestore(这是一个测试,而不是真正的产品) .我想检查文档是否已经存在,以便用户无法再次使用该用户名进行注册。我第一次看到 doc.exists 的实例,但它为我返回 undefined,我查看了文档并找到了 doc.empty,据说它可以检查文档是否为空。我试过了,但它返回了一个承诺拒绝错误。如果我将该行更改为 .exists 或其他内容,那么问题就会消失,因此我已将问题范围缩小到该行。

index.js(后端)

app.post("/registeruser",function (req,res) {
    res.setHeader("Content-Type","application/json");

    try {
        const username = req.body.username;
        const password = req.body.password;
        const passwordEncrypted = HmacSHA1(password,JSON.parse(fs.readFileSync("./keys.json"))["passwordEncryptKey"]).toString();

        // console.log(username,password,passwordEncrypted);

        try {
            firestore.collection("users").get(username).then(function (data) {
                if (data.empty == false) {
                    throw [true,"Already registered user!"];
                }
            }).catch(function (error) {
                throw [true,error];
            });

            if (username == "") {
                firestore.collection("users").add({
                    username: v4(),passwordhash: passwordEncrypted,email: "example@gmail.com",}).then(function () {
                    return res.status(200).send(JSON.stringify({
                        error: false,message: "Successfully registered user!",}))
                }).catch(function (error) {
                    throw [true,error];
                });
            }
            else {
                firestore.collection("users").doc(username).set({
                    username: username,}));
                }).catch(function (error) {
                    throw [true,error];
                });
            }
        }
        catch (error) {
            throw [true,error];
        }
    }
    catch (error) {
        console.log(error);
        const [isError,errorMessage] = error;

        return res.status(404).send(JSON.stringify({
            error: isError,message: errorMessage,}));
    }
});

终端输出

(节点:29448)未处理的PromiseRejectionWarning:[对象数组] (节点:29448) UnhandledPromiseRejectionWarning:未处理的承诺拒绝。这个错误要么是因为在没有 catch 块的情况下抛出了异步函数,要么是因为拒绝了一个没有用 .catch() 处理过的承诺。要在未处理的承诺拒绝时终止节点进程,请使用 CLI 标志 --unhandled-rejections=strict(请参阅 https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode)。 (拒绝编号:1) (节点:29448)[DEP0018] 弃用警告:不推荐使用未处理的承诺拒绝。将来,未处理的承诺拒绝将以非零退出代码终止 Node.js 进程。

解决方法

您有多个并发承诺链,其中一些可能会独立失败。您需要将所有逻辑整合到一个承诺链中。

return firestore.collection("users").get(username)
  .then((data) => {
    if (data.empty == false) {
      throw [true,"Already registered user!"];
    }
  })
  .then(() => {
    if (username == '') {
      return firestore.collection("users").add({/* Your data */});
    }

    return firestore.collection("users").doc(username).set({/* Your data */});
  })
  .then(() => {
    return res.status(200);
  })
  .catch((err) => {
    return res.status(500);
  });

您也可以尝试使用 async/await,这将大大简化这样的逻辑。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?