2014-12-02 78 views
1

我想单独的服务器启动,并从核心文件(app.js),但其他呼叫,当我尝试运行它,它会发出我的错误 http.createServer(app).listen(app.get('port'), function(){ ^ TypeError: Object function(){ all code from app.js file } has no method 'get'node.js的类型错误:对象有没有方法让

这是app.js文件。

/** 
* Module dependencies. 
*/ 
module.exports = function(){ 
    var express = require('express'); 
    var routes = require('./routes'); 
    var path = require('path'); 
    var app = express(); 

    // all environments 
    app.set('port', process.env.PORT || 4000); 
    app.set('views', __dirname + '/views'); 
    app.set('view engine', 'jade'); 
    app.use(express.favicon()); 
    app.use(express.logger('dev')); 
    app.use(express.bodyParser()); 
    app.use(express.methodOverride()); 
    app.use(app.router); 
    app.use(express.static(path.join(__dirname, 'public'))); 

    // development only 
    if ('development' == app.get('env')) { 
     app.use(express.errorHandler()); 
    } 
    app.get('/', routes.index); 
    return app; 
}; 

这是server.js文件。

var http = require('http'), 
    app = require('./app'); 
http.createServer(app).listen(app.get('port'), function(){ 
    console.log('Express server listening on port ' + app.get('port')); 
}); 

使用[email protected]

什么我丢失或做错了..请帮助。

回答

2

你传递一个函数来module.exports,所以当你require('./app'),你需要调用它像一个功能:

var http = require('http'), 
    app = require('./app')(); 
http.createServer(app).listen(app.get('port'), function(){ 
    console.log('Express server listening on port ' + app.get('port')); 
}); 
+0

谢谢,工作......如果我不想将它称为函数,那么我将不得不在'app.js'中更改? – MMK 2014-12-02 13:58:33

+0

请参阅@lante答案。就个人而言,当我分开模块时,我喜欢有函数,因为它允许我传递参数并在'app.js'文件中使用参数。 – jValdron 2014-12-02 13:59:50

+0

是的,明白了,我还会通过一个参数,而不是现在,所以这种方法似乎更好.. – MMK 2014-12-02 14:00:52

3

你无理由退货的功能到您的app.js文件,只返回表达对象:

var express = require('express'); 
var app = express(); 
// ... more variables 

// ... the rest of your code 

module.exports = app; 

然后,你的代码的其余部分为server.js将正常工作。

请记住,module.exports的工作方式类似于CommonJS(因此也称为NodeJS)中的“return”。

参见documentation

相关问题