【问题标题】:Express - Unhandeled Promise rejectionExpress - 未处理的承诺拒绝
【发布时间】:2021-08-21 01:22:10
【问题描述】:

我有两张桌子,一张给毕业生,一张给导师。我想使用以下端点找出一封电子邮件来自哪个表。

router.post("/reset/:email", async (req, res) => {

//search which table the email is from
const { email } = req.params;

try {
    const result_g = await pool.query(
        "select *  from graduates where email=$1",
        [email]
    );
    const result_m = await pool.query("select *  from mentors where email=$1", [
        email,
    ]);
    if (result_g) {
        return res.json({ id: result_g.rows[0].id, user: "graduates"});
    } else if (result_m) {
        return res.json({ id: result_m.rows[0].id, user: "mentors" });
    } else {
        return res.json("email isn't found");
    }
} catch (err) {
    return res.status(500).send(err, "server error");
}
});

但是,我不断收到错误消息“未处理的承诺拒绝警告” 这不仅仅是一个警告,因为我使用邮递员进行了尝试,但请求不起作用。我假设错误来自 result_g 和 result_m 或 if 条件,但我无法确定问题到底出在哪里。如果有人解释为什么在 node/express 中不允许这样做,我将不胜感激。谢谢!

【问题讨论】:

  • #1 你抓到执行了吗?打印错误。 #2 打印查询 1 和 2 的结果以检测是否有错误。 #3 如果要检测的话,在你的决赛中做同样的事情。告诉我们您的日志结果
  • @Bravo 它来自节点。
  • 好的 - 但它不是来自那段代码 - 因为它是由 try/catch “保护”的,没有在 catch 中抛出 - 还有其他问题
  • 除非const { email } = req.params; 当然是抛出 - 即如果req.paramsnullundefined - 将const { email } = req.params; 放在try 中 - 看看它是否至少解决了未处理的问题拒绝
  • 我很惊讶您没有在节点 14 的错误输出中获得清晰的堆栈跟踪。您可以尝试在 process 上收听 unhandledRejection 事件并将 error.stack 记录到那里查看堆栈跟踪。我不认为此错误来自您显示的代码。

标签: javascript node.js express endpoint


【解决方案1】:

此代码中有一些错误。不幸的是,它们结合在一起使得 Node.js 错误消息非常难以阅读。但幸运的是,它们都很容易解决!让我们先分别识别它们,然后将它们放在一起来解释错误。

  • 我们无法检查是否使用 if (result) 返回了行。 mysql query 函数返回一个ResultSet,它总是真实的。 (if (result_g.rows) 也不起作用——empty array is truthy in JavaScript。)

    所以代码中的if (result_g) 总是会执行。下一行包括result_g.rows[0].i。这导致...

  • 访问 undefined 上的属性会引发异常。即使我们的结果集是空的——没有匹配的毕业生——我们运行return res.json({ id: result_g.rows[0].id, user: "graduates"})

    • result_g.rows 是一个空数组 []
    • result_g.rows[0] 返回undefined
    • result_g.rows[0] 引发 TypeError(“未定义不是对象”)。

    catch 块捕获了该错误,这将我们带到了最后一个问题。

  • try/catch 中的响应语法不正确。您尝试通过return res.status(500).send(err, "server error") 发送错误响应,但send() takes only one parameter。 (旧版本的 Express have a 2-argument send() function,但我认为它们也不支持接收异常。)

    这会在您的 catch 块中引发另一个异常。这给出了您在控制台上看到的错误:我们在您的 router.post 定义的异步函数中抛出了一个错误。


幸运的是,我们可以通过一些小的修改来解决这些问题:

  try {
      const result_g = await pool.query(
          "select *  from graduates where email=$1",
          [email]
      );
      const result_m = await pool.query("select *  from mentors where email=$1", [
          email,
      ]);
-     if (result_g) {
+     if (result_g.rows.length > 0) {
          return res.json({ id: result_g.rows[0].id, user: "graduates"});
-     } else if (result_m) {
+     } else if (result_m.rows.length > 0) {
          return res.json({ id: result_m.rows[0].id, user: "mentors" });
      } else {
          return res.json("email isn't found");
      }
  } catch (err) {
-      return res.status(500).send(err, "server error");
+      return res.status(500).send("server error");
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-31
    • 2023-03-17
    • 2018-04-01
    • 2021-09-19
    • 1970-01-01
    相关资源
    最近更新 更多