使用KrakenJS在index.js中导入的模块在其他文件中未定义

时间:2014-01-18 22:59:01

标签: node.js passport.js

在我的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有充分了解的人可以解释如何设置这个以便于访问,或者为什么我需要需要的东西,即使在应用程序开始时需要它们,我也会非常高兴。

1 个答案:

答案 0 :(得分:2)

您似乎稍微误解了Node.js模块系统。您必须在其使用的每个文件中require一个模块。这是通过变量赋值访问模块所必需的(将每个模块视为一个干净的模板)。

这并不像它看起来那么低效。第一个require从文件系统中读取模块,并对其进行评估。同一模块的每个后续require只返回对已评估模块的引用。