Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/425.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Express从server.js导入应用程序时出错_Javascript_Node.js_Express_Server_Commonjs - Fatal编程技术网

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方法的回调将控制权传递回应用程序,而不是传递应用程序对象。但我无法证明为什么这样更好。也许只是简单一点。你能用代码演示一下这个例子吗@克里斯蒂安弗里茨