2012-03-02 4 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

+0

Вы не связываете запрос с файлом, вы выполняете код, который регистрирует обработчик для шаблона пути. На самом деле не имеет значения, где этот код хранится, только если вы его запустите. Это важная идея для понимания. Но это сказало, я не совсем понимаю, что вы просите ... –

+0

Позвольте мне попробовать еще раз. Возьмите первый пример. Проблема, которую я вижу, заключается в следующем: при добавлении дополнительных страниц вам необходимо обновить 'server.js' с помощью нового' require' на странице. По мере роста вашего сайта это может стать очень утомительным. Можно ли это сделать более динамично, чтобы URI запроса использовался как имя файла JS, обрабатывающего запрос? – pixelfreak

Смежные вопросы