我正在编写一个基于mudule express的NodeJS应用程序。以下是我的app.js的重要部分:
var express = require('express')
, routes = require('./routes')
, passport = require('passport')
, LocalStrategy = require('passport-local').Strategy;
var app = module.exports = express.createServer();
var ab = 'this is a test!';
// Configuration
app.configure(function(){
...
// Routes
app.get('/', routes.index);
app.listen(3000);
Routes.index - 是一个控制器,在请求'/'时执行。这是代码:
exports.index = function(req, res){
passport.serializeUser(function(user, done) {
done(null, user.id);
});
...
res.render('index.ejs', {
title: ab
})
};
从技术上讲,index.js是一个单独的文件,位于'/ routes'文件夹中。因此,当我启动我的应用程序时,它崩溃导致无法找到护照var,在主应用程序中声明。此外,ab也无法找到,但它已被宣布。如果我在index.js中重新分解变量,JS将为我创建新对象。如何在我的应用程序的每个模块中使用我的变量?我查看了一些关于SO的主题,但无法理解 - 这是一个常见问题还是只是我的应用程序结构错了?谢谢!
答案 0 :(得分:4)
正如您所发现的,在一个模块中声明的变量不会神奇地出现在其他模块中。当涉及护照等模块时,通常人们只需要在需要的地方再次使用它们,所以:
app.js:
var passport = require('passport'),
index = require('./routes/index');
index.js:
var passport = require('passport');
有时你想传递参数 - 我经常为单元测试做,如果我可以传入依赖项,我也可以模拟这些依赖项。或者您有一个想要传递的应用程序范围的配置。我经常这样做:
app.js:
var ab = "foo",
index = require('/routes/index')(ab);
index.js:
module.exports = function(ab) {
// Here I have access to ab and can to what I need to do
return {
index: function(req, res) { res.send(ab) }
}
}
其他人更喜欢“单身”模式,每次需要模块时,检查它是否已经初始化,如果是,则传递该实例。