从 server.js 快速导入应用程序给我一个错误

问题描述

我在我的 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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...