在我的index.js文件中,我需要一些我的应用程序所需的库。
var kraken = require('kraken-js'),
app = {},
db = require('./lib/database'),
passport = require('passport'),
User = require('./models/user'),
auth = require('./lib/auth');
但是,在使用这些库的其他文件中,它们似乎是不可见的,我不明白为什么因为它应该在底层范围内可用?
我有一个名为login.js的控制器,如下所示:
var LoginModel = require('../models/login');
module.exports = function (app) {
var model = new LoginModel();
app.get('/login', function (req, res) {
//Include any error messages that come from the login process.
model.messages = req.flash('error');
res.render('login', model);
});
app.get('/auth/facebook', passport.authenticate('facebook'));
app.get('/auth/facebook/callback', passport.authenticate('facebook', { failureRedirect: '/login' }), function(req, res) {
// Successful authentication, redirect home.
res.redirect('/');
});
app.get('/logout', function (req, res) {
req.logout();
res.redirect('/');
});
};
我认为当我尝试使用[ReferenceError: passport is not defined]
运行应用程序时,这是输出npm start
的文件(因为没有其他报告)。坦率地说,我不明白控制器是如何启动的,这可能是我不理解这个问题的原因。
我想尽可能导入我需要的所有内容,但我发现自己使用的需求方式超出了我的预期。如果对KrakenJS / Express有充分了解的人可以解释如何设置这个以便于访问,或者为什么我需要需要的东西,即使在应用程序开始时需要它们,我也会非常高兴。
答案 0 :(得分:2)
您似乎稍微误解了Node.js模块系统。您必须在其使用的每个文件中require
一个模块。这是通过变量赋值访问模块所必需的(将每个模块视为一个干净的模板)。
这并不像它看起来那么低效。第一个require
从文件系统中读取模块,并对其进行评估。同一模块的每个后续require
只返回对已评估模块的引用。