2012-03-02 30 views
4

我是Node.js(和Express)的新手,我試圖理解這一點。假設我有一個3頁的網站(可以是GET或POST):/,/page1,/page2。我該怎麼做才能讓每個頁面都由一個單獨的JS文件處理?在Node.js中組織各種請求

app.all('/', function(request, response) 
{ 
    // Get home.js to handle this request and response 
}); 
app.all('/page1', function(request, response) 
{ 
    // Get page1.js to handle this request and response 
}); 
app.all('/page2', function(request, response) 
{ 
    // Get page2.js to handle this request and response 
}); 

更好的是,有沒有辦法定義通配符,所以沒有太多的重複?事情是這樣的:

app.all('*', function(request, response) 
{ 
    // Get *.js to handle this request and response. * is whatever the URI string is 
}); 

回答

0

繼續我與@Alex的討論。這是我做到的。任何疑難雜症?

// app.js 
var EXPRESS = require('express'); 
var URL = require('url'); 
var PATH = require('path'); 

var app = EXPRESS.createServer(); 

app.all(/^\/([a-zA-Z0-9-]+)$/, function(request, response, next) 
{ 
    var page = request.params[0]; 
    if (PATH.existsSync(__dirname + '/' + page + '.js')) 
    { 
     require('./' + page).handleRequest(request, response, next); 
    } 
    else 
    { 
     next(); 
    } 
}); 

app.all('*', function(request, response) 
{ 
    response.send('Catch all'); 
}); 

// --- truncated for brievity 


// page1.js 
exports.handleRequest = function(request, response, next) 
{ 
    response.send('Howdy!'); 
}; 
4

的這裏訣竅是,app是本地的創建它的文件。所以你必須把這個對象放到其他文件的範圍內。

每個其他文件應該導出一個功能,您可以將您的應用程序實例傳遞給它,以便它可以註冊新的路線。像這樣的方法應該可行。

// home.js 
exports.register = function(app) { 
    app.all('/', function(request, response) { ... }); 
}; 

// page1.js 
exports.register = function(app) { 
    app.all('/page1', function(request, response) { ... }); 
}; 

// page2.js 
exports.register = function(app) { 
    app.all('/page2', function(request, response) { ... }); 
}; 

//server.js - setup the app 
app = express.createServer(); 
require('./home').register(app); 
require('./page1').register(app); 
require('./page2').register(app); 

而對於你的問題,你想分享一些設置方法的第二部分?

app.all('*', function(req, res, next) { 
    res.header 'x-snazzy-header', 'Im so snazzy' 
    next() 
}); 

app.all('/page/:id', function(req, res) { 
    res.send('content for page #'+ req.params('id')); 
}); 

首先,你可以使用*或命名PARAMS像/users/:id,以配合各種路線。如果你想做一些常見的設置,你可以實際執行2條路線。路由處理程序採用可選的第三個參數next。當被調用時,它將嘗試找到下一條匹配的路線。所以你可以爲它的一堆路線設置一些常見的標題。

+0

謝謝。幾乎在那裏,但不完全。如何使用第二個示例將所有傳入請求路由到其相應的文件(使用請求路徑作爲文件名)?我的第二個問題,基本上。 – pixelfreak 2012-03-02 01:34:44

+0

您不要將請求綁定到文件,而是執行將處理程序註冊到路徑模式的代碼。代碼的存儲位置並不重要,只是運行它。這是理解一個重要的想法。但是,這說,我不太清楚你在問什麼... – 2012-03-02 01:37:09

+0

讓我再試一次。拿你的第一個例子。我看到的問題是:當你添加更多的頁面時,你需要用新的'require'每頁更新'server.js'。隨着你的網站變得更大,這可能變得非常單調乏味。它是否可以更動態地完成,以便將請求的URI用作處理請求的JS的文件名? – pixelfreak 2012-03-02 01:43:23