节点 GET 请求挂起无法完成请求,页面继续加载

时间:2021-01-20 15:32:42

标签: javascript node.js mongodb express

已解决

我目前正在使用 Node - Express - MongoDB - ejs 构建一个应用。

我有一个书籍路由器,它应该从 MongoDB 呈现书籍 ejs 文件和书籍列表。 这是 books.js 代码:

const express = require("express");
const router = express.Router();
const { MongoClient } = require("mongodb");

router.route("/").get(async (req, res, next) => {
  const url = "mongodb://localhost:27017";
  const dbName = "Library";
  let client;
  try {
    client = await MongoClient.connect(url, { useUnifiedTopology: true });
    const db = client.db(dbName);
    const books = await db.collection("books").find().toArray();

    res.render({
      title: "Books",
      books,
    });
  } catch (err) {
    res.send(err);
  }
});

module.exports = router;

它应该从 MongoDB 获取数据并将其发送回书籍页面而不是我收到此错误 { "code": "ERR_INVALID_ARG_TYPE" }

2 个答案:

答案 0 :(得分:1)

您定义了一个名为 mongo 的函数,但是您从不调用它

因为你从不调用它,所以你永远不会调用 res.render

即使您确实调用了它,在 catch 分支中您也永远不会发送错误响应。

看起来您打算将其用作 IIFE,但后来忘记了 ()。不过没有必要,您可以将您作为第二个参数传递给 get() async 的函数改为。

router.route("/").get(async (req, res) => {
    const url = "mongodb://localhost:27017";
    const dbName = "Library";

    try {
        const client = await MongoClient.connect(url, { useUnifiedTopology: true });
        const db = client.db(dbName);
        const books = await db.collection("books").find().toArray();

        res.render({
            title: "Books",
            books,
        });
    } catch (err) {
        console.log(err);
        res.status(500).json({error: err})
    }  
});

答案 1 :(得分:1)

您似乎没有调用异步 mongo 函数。您只是在声明您的功能。您需要通过在声明后放置 () 来调用它,如下所示:

(async function mongo() {
    // Your code
})();

因此,将该更改应用于您的代码将导致以下结果:

const express = require("express");
const router = express.Router();
const { MongoClient } = require("mongodb");

/* GET Books page. */
router.route("/").get((req, res, next) => {
  const url = "mongodb://localhost:27017";
  const dbName = "Library";
  (async function mongo() {
    let client;
    try {
      client = await MongoClient.connect(url, { useUnifiedTopology: true });
      const db = client.db(dbName);
      const books = await db.collection("books").find().toArray();

      res.render({
        title: "Books",
        books,
      });
    } catch (err) {
      console.log(err);
    }
  })();
});


module.exports = router;

因此,您的请求确实会超时,因为未调用异步函数中的代码。

希望这个回答对您有帮助?