2014-10-07 20 views
1

當app.listen()與app.get()在同一個文件中時,它可以工作;當我通過require在其他文件中添加app.get()調用時,它們不起作用:爲什麼Express.js的app.get()只能在同一個文件中調用app.listen()被調用?

// ~ means root folder 
// This below is in ~/index.js 
var routes = require('~/routes/routes.js'); 

var server = app.listen(3000, function() { 
    console.log('Listening on port %d', server.address().port); 
}); 

app.get('/snails', function (req, res) { 
    res.send('ESCARGOT'); 
}); 

// This below is in ~/routes/routes.js 
var app = module.exports = require('exports')(); 

app.get('/birds', function() { 
    res.send('PENGUIN'); 
}); 

// SUCCESS -> localhost:3000/snails will return "ESCARGOT" 
// FAIL -> localhost:3000/birds will return "Cannot GET /birds" 

第二個證明點的例子;這次,app.listen()被移動到routes.js:

// ~ means root folder 
// The below is in ~/index.js 
var routes = require('~/routes/routes.js'); 

app.get('/snails', function (req, res) { 
    res.send('ESCARGOT'); 
}); 

// The below is in ~/routes/routes.js 
var app = module.exports = require('exports')(); 

app.get('/birds', function() { 
    res.send('PENGUIN'); 
}); 

var server = app.listen(3000, function() { 
    console.log('Listening on port %d', server.address().port); 
}); 

// FAIL -> localhost:3000/snails will return "Cannot GET /snails" 
// SUCCESS -> localhost:3000/birds will return "PENGUIN" 

這是爲什麼?是否因爲app.listen()只針對調用它的文件?

+0

你是否包含'routes/routes.js'?它有權訪問「應用程序」嗎? – 2014-10-07 17:58:36

+0

編輯上面的代碼以包含它們 – geoyws 2014-10-07 17:59:21

+0

我不確定爲什麼這樣會起作用,因爲您不會將'res'添加爲路由回調參數之一。 – 2014-10-07 18:00:44

回答

0

您需要導出您的應用程序,包括它在你的路由文件

module.exports = app; 

然後在你的路由文件

var app = include('pathtoyourapp.js'); 

然後,你必須在你的路線文件訪問到你的應用程序。

+0

剛剛更新我的問題,包括那些 – geoyws 2014-10-07 18:04:52

0

你應該做沿此線的東西在routes/routes.js

module.exports = function(app) { 
    app.get('/birds', function(req, res, next) { 
    res.send('Hello'); 
    }); 
}; 

,並在index.js

var app = express(); 
app.get('/snails', function(req, res, next) { 
    res.send('SNAILS'); 
}); 
require('./routes/routes')(app); 

app.listen(3000); 

現在應該工作。

BTW我不是100%肯定你正在嘗試做require('exports')()做的,它看起來奇怪,你實際上出口的是,代替app(包含新birds路線)在routes/routes.js,所以這是爲什麼它可能不起作用。試試我建議的方式。

讓我知道你是否需要任何額外的東西。

0

使用例如:

var express = require('express'), 
    http = require('http'), 
    port = Number(process.env.PORT || 3000), 
    app = express(); 

app.get('/', function(req, res) { 
    res.end('Test message'); 
}); 

http.createServer(app).listen(port); 

最重要的是:

http.createServer(app).listen(port); 

發送應用論據服務器行爲的操縱。

相關問題