已解决
我目前正在使用 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" }
答案 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;
因此,您的请求确实会超时,因为未调用异步函数中的代码。
希望这个回答对您有帮助?