這是創建測驗路由的 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);
為什么我不能在異步函式內創建路由?
這是replit專案的鏈接 - 隨意分叉
uj5u.com熱心網友回復:
我知道這不是您問題的直接答案。
但問題是您無法正確構建您的代碼。
所以在下面你可以看到應用程式結構具有單獨的 db 和 app 模塊,其中應用程式在 db 連接后開始偵聽。
服務器.js
const http = require('http');
const db = require('./db');
const app = require('./app');
const server = http.createServer(app);
const PORT = process.env.PORT || 8000;
(async () => {
await db.connect();
console.log('connected to db');
server.listen(PORT, () => {
console.log(`app listening at port: ${PORT}`);
});
})();
資料庫.js
const mongoose = require('mongoose');
const UserSchema = require('./schemas/User');
mongoose.model('User', UserSchema);
module.exports = {
connect: function() {
const dsn = `mongodb srv://replitUser:${process.env.DB_PW}@issuetracker.pbbm6.mongodb.net/myFirstDatabase?retryWrites=true&w=majority`;
return mongoose.connect(dsn);
},
model: function(name) {
return mongoose.model(name);
},
};
應用程式.js
const express = require('express');
const app = express();
const routes = require('./routes');
app.use(routes);
module.exports = app;
路線/ index.js
const express = require('express');
const router = express.Router();
const users = require('./users');
router.use('/api/users', users);
module.exports = router;
路線/用戶.js
const express = require('express');
const router = express.Router();
const db = require('../db');
const User = db.model('User');
router.get('/', async (req, res) => {
const users = await User.find({}).lean();
res.status(200).send({users});
});
router.get('/:id', async (req, res) => {
const user = await User.findById(req.params.id).lean();
if (!user) {
return res.status(404).end();
}
res.status(200).send(user);
});
module.exports = router;
模式/User.js
const mongoose = require('mongoose');
const {Schema} = mongoose;
const UserSchema = new Schema({
username: Schema.Types.String,
password: Schema.Types.String,
name: Schema.Types.String,
});
module.exports = UserSchema;
uj5u.com熱心網友回復:
解決方案是簡單地使用express.Router().
首先,我必須創建一個路由器并將其安裝到/api路徑:
const router = express.Router();
app.use("/api", router);
然后,我可以使用router.get()而不是app.get().
const databaseConnection = async (router) => {
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(router);
router.get("/test", (req, res) => {
res.send("it worked");
});
} catch (err) {
console.log("an err occurred", err);
}
}
databaseConnection(router);
我不知道為什么,但現在該路線按預期作業。如果我在apiRoutes模塊中創建路由,它也可以作業。
這是replit上固定專案的鏈接
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/343620.html
標籤:javascript 节点.js 表达 异步等待
