从node.js中的模块内调用app.js的函数?

Jam*_*son 3 javascript design-patterns module node.js

假设我有以下app.js(显然非常简化):

var express = require('express'),
    app = express.createServer();

// include routes
require('./lib/routes')(app);

// some random function
var foo = function() {
    return 'bar';
};

// another random function
var foo2 = function() {
    return 'bar2';
};
Run Code Online (Sandbox Code Playgroud)

然后我有路由模块:

module.exports = function(app){
    app.get('/some/route', function(req, res){
        var fooBar = foo(),
            fooBar2 = foo2();

        res.end(fooBar + fooBar2);
    });
};
Run Code Online (Sandbox Code Playgroud)

这显然不起作用,因为foo和foo2没有在模块中定义.有没有办法让这个工作,或至少一个不同的模式,以更好地完成这个?

Far*_*hat 6

那么你可以把这两个函数放在一个对象中,并在routes.js初始化时传递它们.

var express = require('express'),
    app = express.createServer();

// some random function
var foo = function() {
    return 'bar';
};

// another random function
var foo2 = function() {
    return 'bar2';
};

var fns = {foo : foo, foo2: foo2}

// include routes
require('./lib/routes')(app, fns);
Run Code Online (Sandbox Code Playgroud)

在路线:

module.exports = function(app, fns){
    app.get('/some/route', function(req, res){
        var fooBar = fns.foo(),
            fooBar2 = fns.foo2();

        res.end(fooBar + fooBar2);
    });
};
Run Code Online (Sandbox Code Playgroud)

这是我怎么做的.您还可以将它们包含在app对象中.除了在init函数中传递它们之外,您还可以导出这两个函数并在routes.js中需要它们.

var express = require('express'),
    app = express.createServer();

// some random function
var foo = function() {
    return 'bar';
};

// another random function
var foo2 = function() {
    return 'bar2';
};

module.exports = {foo : foo, foo2: foo2}

// include routes
require('./lib/routes')(app, fns);
Run Code Online (Sandbox Code Playgroud)

在路线:

module.exports = function(app){
    var fns = require('../app.js');
    app.get('/some/route', function(req, res){
        var fooBar = fns.foo(),
            fooBar2 = fns.foo2();

        res.end(fooBar + fooBar2);
    });
};
Run Code Online (Sandbox Code Playgroud)

但我不喜欢它的想法,因为它产生循环依赖.对他们没有任何好感.

  • 原始问题和这个被接受的答案都暗示`module.exports`是一个被调用的函数.不是.它是一个包含函数的对象.同样,问题和这个答案在定义的右括号之后都有一个尾随")".例如`module.exports = function(app){..})` - 首先,这将永远不会执行.另一方面,它应该是类似`module.exports.myfunc = function(args){...}`或`module.exports = {myfunc1:function(){...},myfunc2:function(){. ..}}`; 好吧这是一个老问题,但为了新手,它需要澄清. (2认同)