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



已解决

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

我有一个图书路由器,它应该从MongoDB中呈现books-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" }

您似乎没有调用异步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;

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

希望这个答案有帮助👍

您定义了一个名为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})
}  
});

相关内容

  • 没有找到相关文章

最新更新