Javascript Express从server.js导入应用程序时出错
我在我的Javascript Express从server.js导入应用程序时出错,javascript,node.js,express,server,commonjs,Javascript,Node.js,Express,Server,Commonjs,我在我的server.js文件中创建了一个express server,并从中导出app //server.js require("dotenv").config(); const express = require("express"); const app = express(); const connectToDb = require("./connectToDb") connectToDb().catch(c
server.js
文件中创建了一个express server,并从中导出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
我从connectToDb.js
文件中的server.js
导入app
//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不是一个函数。我不知道为什么它会给我一个错误,因为我已经导出了app
。我做错了什么?那是因为你有一个循环依赖。这两个文件相互导入,在server.js
中,您可以在加载时立即调用。在调用server.js
内部的connectToDb
时,server.js
文件尚未完全执行,因此模块导出尚未发生。无论哪种方式,都应该尽量避免(循环依赖)
只需将app
作为参数传递给connectToDb
函数,而不是将其导入,即可解决此循环:
//server.js
require(“dotenv”).config();
const express=要求(“express”);
常量app=express();
const connectToDb=require(“./connectToDb”)
connectToDb(app.catch(console.dir)
应用程序使用((请求、回复)=>{
res.status(404)。发送(“无法找到”);
});
module.exports=app
//connectToDb.js
const MongoClient=require(“mongodb”)。MongoClient;
const client=new MongoClient(process.env.MONGO_URI{
useNewUrlParser:true,
useUnifiedTopology:正确
});
const port=process.env.port | 3000;
const connectToDb=异步(应用程序)=>{
试一试{
等待client.connect();
日志(“已正确连接到服务器”);
应用程序侦听(端口,()=>{
log(`listing on port${port}`);
})
}捕捉(错误){
console.log(err.stack);
}最后{
等待客户端。关闭();
log(“你好”)
}
}
module.exports=connectToDb
好的,谢谢您的解决方案!你认为这是连接数据库的好方法吗?我认为这是合理的。就我个人而言,我更喜欢有一条执行的“主线”,而不是过多地传递控制权。因此,我会使用connectToDb方法的回调将控制权传递回应用程序,而不是传递应用程序对象。但我无法证明为什么这样更好。也许只是简单一点。你能用代码演示一下这个例子吗@克里斯蒂安弗里茨