在Node.js中组织各种请求

时间:2012-03-02 01:00:42

标签: javascript node.js

我是Node.js(和Express)的新手,我正试图理解这一点。假设我有一个3页的网站(可以是GET或POST)://page1/page2。我该怎么做才能让每个页面都由一个单独的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
});

2 个答案:

答案 0 :(得分: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'));
});

首先,您可以使用*或命名为/users/:id的参数来匹配一系列路线。如果你想做一些常见的设置,你实际上可以执行2条路线。路由处理程序采用可选的第三个参数next。调用时,它将尝试查找下一个匹配的路径。因此,您可以使用它为一堆路径设置常见标题等内容。

答案 1 :(得分: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!');
};