【问题标题】:Express importing app from server.js is giving me an error从 server.js 快速导入应用程序给我一个错误
【发布时间】:2021-07-30 01:38:21
【问题描述】:

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

我在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 is not a function。我不知道为什么它给我一个错误,因为我已经导出了app。我做错了什么?

【问题讨论】:

    标签: javascript node.js express server commonjs


    【解决方案1】:

    那是因为你有一个循环依赖。这两个文件相互导入,server.js 中,您在加载时立即进行调用。在您在server.js 内部调用connectToDb 的那一刻,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
    

    【讨论】:

    • 好的,谢谢您的解决方案!你认为这是连接数据库的好方法吗?
    • 我认为这是合理的。就我个人而言,我更喜欢有一个执行的“主线”,而不是过多地传递控制权。所以我会使用 connectToDb 方法的回调将控制权传递回应用程序,而不是传递应用程序对象。但我无法真正证明为什么这样做更好。也许只是更容易阅读。
    • 你能用代码演示这个例子吗? @ChristianFritz
    猜你喜欢
    • 2014-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-12
    • 2021-05-27
    • 1970-01-01
    相关资源
    最近更新 更多