如何添加自定义功能来表达模块

时间:2019-09-22 17:15:02

标签: node.js express

我正在尝试添加一种方法 loadSiteSettings表示模块

     In app.js


        var express = require('express');
        var path = require('path');
        var mongoose = require('mongoose');

        //Set up default monggose connection for mongo db
        var mongoDB = 'mongodb+srv://***:*****@cluste******j.mongodb.net/cms?retryWrites=true&w=majority';
        mongoose.connect(mongoDB,{useNewUrlParser: true});
        //Get the default connection
        var db = mongoose.connection;

        //Bind connection to error event (to get notification of connection errors)
        db.on('error',console.error.bind(console, 'MongoDB connection error:'));///????????

        var app = express();

///////////////////////////////////////////////////////////
       var indexRouter = require('./routes/index');

        app.loadSiteSettings = async function()
        { 
          let setting = await db.collection('settings').findOne();
          app.locals.siteSettings = setting;
        }

        app.loadSiteSettings();
//////////////////////////////////////////////////////
        module.exports = app;



Index.Js for router

var express = require('express');
var router = express.Router();
var app = require('../app');
var util = require('util');
/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index');
});
///////////////////////////////////////////
router.get('/reloadSettings', function(req,res,next){
    app.loadSiteSettings();
})
///////////////////////////////////////

module.exports = router;

问题就在这里,当服务器启动时,它会在app.js中调用app.loadSiteSettings() 但是当我使用路由'/ reloadSettings'时,似乎app在index.js中未定义

1 个答案:

答案 0 :(得分:0)

这是循环依赖项和module.exports的问题。 This答案显示了相同的问题。

正在发生的事情是,首先需要app.js并开始处理。要了解的重要一点是,文件需要新文件时暂停

因此,当app.js需要./routes/index时,它尚未完成处理,并且尚未达到module.exports = app。这意味着,当您的路由文件需要app.js时,它就需要它处于当前状态,这是默认导出{}

幸好有一个非常简单的解决方法:

// can be imported and tested separately from the app
const loadSiteSettings = function() { 
    return db.collection('settings').findOne();
}


router.get('/reloadSettings', async function(req,res,next){
    let settings = await loadSiteSettings();
    req.app.locals.siteSettings = settings

    res.send(200); // signal the response is successful
})

This更深入地解释了这个问题,以防您感兴趣