我正在尝试添加一种方法 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中未定义
答案 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更深入地解释了这个问题,以防您感兴趣