【问题标题】:Google Firestore promisesGoogle Firestore 承诺
【发布时间】:2019-08-30 20:20:55
【问题描述】:

我目前正在尝试研究如何使用 Firestore 和 NodeJS 进行基本查询。我收到错误“预期的 catch() 或返回”。我希望有人能解释为什么会这样?

我正在使用快速路由器来处理路由。

方法一、ESLint错误

userRouter.get("randomroutename", (req, res) => {

    const uid = req.params.uid;
    console.log("User: " + uid);

    let collectionRef = db.collection('col');
    collectionRef.add({foo: 'bar'}).then(documentReference => {
        console.log(`Added document with name: ${documentReference.id}`);
        res.status(200).send('SUCCESS');
    });
});

环顾四周并尝试了一些似乎可行的方法后,但我真的很困惑为什么需要退货。当函数'add'肯定返回我可以访问的promise时,为什么我需要返回一个promise对我来说真的没有意义 .then 。

方法2.没有错误

userRouter.get("randomroutename", (req, res) => {

    const uid = req.params.uid;
    console.log("User: " + uid);

    let collectionRef = db.collection('col');
    return collectionRef.add({foo: 'bar'}).then(documentReference => {
        console.log(`Added document with name: ${documentReference.id}`);
        return res.status(200).send('SUCCESS');
    });
});

根据文档 (https://googleapis.dev/nodejs/firestore/latest/CollectionReference.html),我相信方法 1 应该有效。

感谢您的帮助! (非常抱歉,如果这是非常明显的,我就是无法理解它......)

【问题讨论】:

    标签: javascript firebase promise google-cloud-firestore eslint


    【解决方案1】:

    消息是“预期的 catch() 或返回”。请注意,这里有两个选项。如果您想将承诺的责任传递给调用者,使用return 是合适的,但这不是您想要做的。你应该做的是捕获then返回的promise捕获的任何潜在错误,并适当地处理它们:

    collectionRef.add({foo: 'bar'}).then(documentReference => {
        console.log(`Added document with name: ${documentReference.id}`);
        res.status(200).send('SUCCESS');
    }).catch(err => {
        res.status(500);
    })
    

    这样,如果由于任何原因添加文档时出错,它将向客户端生成 500 响应。

    这些都不是 Firestore 独有的。这只是处理 ESLint 试图让你去做的承诺的最佳实践。

    【讨论】:

    • 嗨,Doug,感谢您的回复,但我不相信这能回答我的问题。我完全知道需要一个 catch 语句来发回一个错误。我的问题是为什么需要 return 声明?没有返回 ESLint 会抛出错误“Expected catch() or returneslint(promise/catch-or-return)”。非常感谢,莱昂
    • 如果你使用 catch 代替它应该是不需要的。如果您不使用 catch,则需要 return 以将承诺的责任传递给调用者,调用者应该捕获任何错误。你有一个选择,但这里只有一个是正确的,因为 express 不会为你处理这个承诺。
    • eslint promise/catch-or-return 的正式文档在这里:github.com/xjamundx/eslint-plugin-promise/blob/master/docs/…
    • 我已经尝试过 catch 语句,这让我很困惑。添加 catch 语句后,ESLint 会抛出错误“每个 then() 都应该返回一个值或 throweslint(promise/always-return)”。这对我来说毫无意义,因为正如你所说“快递不会处理那个承诺”。
    • eslint 文档描述了它试图检查的内容,并为您提供了更多信息的链接。虽然您的代码可能并非绝对需要运行,但 lint 警告试图告诉您潜在的错误在哪里,以及您可以做些什么来向您的代码读者阐明您知道自己在做什么。你可以不同意这个建议,但这不会阻止 linter 抱怨。这取决于你 - 添加代码行告诉 eslint 你知道你在做什么,或者禁用警告。
    猜你喜欢
    • 2019-01-08
    • 2020-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-31
    • 1970-01-01
    相关资源
    最近更新 更多