已解决
我目前正在用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})
}
});