【发布时间】:2021-12-14 01:56:32
【问题描述】:
这是创建测试路由的 api.js 模块:
'use strict';
module.exports = function (app) {
console.log("before route creation");
app.get("/api/test", (req, res) => {
res.send("it worked");
});
console.log("routes created");
};
在 server.js 文件中,我将此模块导入为apiRoutes。然后,我在异步函数中调用它。
const databaseConnection = async (apiRoutes, app) => {
try {
await mongoose.connect(`mongodb+srv://replitUser:${process.env.DB_PW}@issuetracker.pbbm6.mongodb.net/myFirstDatabase?retryWrites=true&w=majority`);
console.log("db connection successful");
//Routing for API
console.log("apiRoutes called");
apiRoutes(app);
} catch (err) {
console.log("an err occurred", err);
}
}
databaseConnection(apiRoutes, app);
// apiRoutes(app);
字符串"before route creation" 和"routes created" 被记录到控制台。但是,尽管没有发生错误,但该路由似乎不起作用。
如果我在异步函数之外调用apiRoutes,就像这里:
const databaseConnection = async (apiRoutes, app) => {
try {
await mongoose.connect(`mongodb+srv://replitUser:${process.env.DB_PW}@issuetracker.pbbm6.mongodb.net/myFirstDatabase?retryWrites=true&w=majority`);
console.log("db connection successful");
//Routing for API
// console.log("apiRoutes called");
// apiRoutes(app);
} catch (err) {
console.log("an err occurred", err);
}
}
databaseConnection(apiRoutes, app);
apiRoutes(app);
...它将成功创建测试路线。
我尝试直接在 async 函数内部而不是在新模块中创建路由,它什么也没改变,仍然没有创建路由。
const databaseConnection = async (apiRoutes, app) => {
try {
await mongoose.connect(`mongodb+srv://replitUser:${process.env.DB_PW}@issuetracker.pbbm6.mongodb.net/myFirstDatabase?retryWrites=true&w=majority`);
console.log("db connection successful");
//Routing for API
// console.log("apiRoutes called");
// apiRoutes(app);
app.get("/api/test", (req, res) => {
res.send("it worked");
});
} catch (err) {
console.log("an err occurred", err);
}
}
databaseConnection(apiRoutes, app);
为什么我不能在异步函数中创建路由?
Here is a link to the project on replit - Feel free to fork
【问题讨论】:
-
为什么不简单地制作 server.js 将连接到 db 然后基于 express 实例化应用程序?
-
警告
app.route('/:project/').get(...)注册了一个通配符路由,它将匹配所有顶级路由。这通常是一种不好的做法,并且可能会导致问题,因为它甚至会匹配像/contacts、/help等简单的东西,您不希望将其作为项目名称,因为您的前端可能想要使用各种其设计中的顶级 URL。使用app.get("/project/:project", ...)会更安全,因为它会为您的项目 URL 创建一个特殊的 URL 命名空间,以便您的应用可以使用顶级 URL。
标签: javascript node.js express async-await