问题描述
我在我的 server.js
文件中创建了一个快速服务器,并从中导出了 app
。
//server.js
require("dotenv").config();
const express = require("express");
const app = express();
const connectToDb = require("./connectToDb")
connectToDb().catch(console.dir)
app.use((req,res) => {
res.status(404).send("unable to find");
});
module.exports = app
我从 app
文件中的 server.js
导入 connectToDb.js
//connectToDb.js
const app = require("./server")
const MongoClient = require("mongodb").MongoClient;
const client = new MongoClient(process.env.MONGO_URI,{
useNewUrlParser: true,useUnifiedTopology: true
});
const port = process.env.PORT || 3000;
const connectToDb = async () =>{
try {
await client.connect();
console.log("Connected correctly to server");
app.listen(port,() => {
console.log(`Listening on port ${port}`);
})
} catch (err) {
console.log(err.stack);
} finally {
await client.close();
console.log("hello")
}
}
module.exports = connectToDb
它成功连接到数据库,但是当它到达 app.listen
时,它给了我这个错误:TypeError: app.listen is not a function
。我不知道为什么它给我一个错误,因为我已经导出了 app
。我做错了什么?
解决方法
那是因为你有一个循环依赖。这两个文件相互导入,和在 server.js
中,您在加载时立即调用。当您在 connectToDb
内调用 server.js
时,server.js
文件尚未完全执行,因此模块导出尚未发生。无论哪种方式,您都应该尽量避免(循环依赖)。
只需将 app
作为参数传递给 connectToDb
函数而不是导入它来解决循环:
//server.js
require("dotenv").config();
const express = require("express");
const app = express();
const connectToDb = require("./connectToDb")
connectToDb(app).catch(console.dir)
app.use((req,res) => {
res.status(404).send("unable to find");
});
module.exports = app
// connectToDb.js
const MongoClient = require("mongodb").MongoClient;
const client = new MongoClient(process.env.MONGO_URI,{
useNewUrlParser: true,useUnifiedTopology: true
});
const port = process.env.PORT || 3000;
const connectToDb = async (app) =>{
try {
await client.connect();
console.log("Connected correctly to server");
app.listen(port,() => {
console.log(`Listening on port ${port}`);
})
} catch (err) {
console.log(err.stack);
} finally {
await client.close();
console.log("hello")
}
}
module.exports = connectToDb