【问题标题】:NodeJS - accessing variables in different modulesNodeJS - 访问不同模块中的变量
【发布时间】:2012-07-06 08:36:18
【问题描述】:

我正在编写一个基于 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”文件夹中。所以,当我启动我的应用程序时,它崩溃了,因为找不到护照变量,在主应用程序中声明。此外,ab 也找不到,但是它被声明了。如果我在 index.js 中重新声明变量,JS 将为我创建新对象。如何在我的应用程序的每个模块中使用我的变量?我浏览了一些关于 SO 的主题,但无法理解 - 这是一个常见问题还是我的应用程序的结构错误?谢谢!

【问题讨论】:

    标签: node.js variables module


    【解决方案1】:

    正如您所发现的,在一个模块中声明的变量不会神奇地出现在其他模块中。当涉及到诸如护照之类的模块时,通常人们只是在需要它们的地方再次需要它们,所以:

    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) }
        }
    }
    

    其他人更喜欢“单例”模式,每次需要模块时,检查它是否已经初始化,如果是,则传递该实例。

    【讨论】:

    • 谢谢,但是让我们想象一下,对于我的 50 个页面,我有多达 50 个 js 控制器。他们中的大多数都需要护照,所以这意味着我应该在每个控制器中声明它,例如 index.js、about.js 等?
    • 是的,或者你将它作为参数传递。标准做法是在本地要求您需要的任何模块。
    猜你喜欢
    • 1970-01-01
    • 2017-05-23
    • 1970-01-01
    • 2015-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多