express.js路由器中的自定义处理程序

时间:2013-10-21 14:05:52

标签: javascript node.js express

我正在为简单的用餐信息页面工作,我需要在一个进程中运行静态和动态(json)服务器,如下所示:

*- root
  +- index.html
  +- res
  | +- main.js
  | +- index.css
  | `- (and more)
  +- meal
  | `- custom handler here (json reqestes)
  `- share
    `- (static files, more)

静态文件将使用express.static处理,我可以使用express吗?

2 个答案:

答案 0 :(得分:1)

是的,这可以通过Express完成。您的设置可能如下所示:

app.use('/share', express.static('share'));
app.get('/', function(req, res) {
  res.sendfile('index.html');
});
app.get('/meal/:param', function(req, res) {
  // use req.params for parameters
  res.json(/* JSON object here */);
});

如果您将静态文件服务器挂载到/share并路由到名为/share的目录,则/处的路由将发送名为index.html的文件,并且接受参数的路由,以JSON响应。

静态文件服务器将尝试处理未被路由捕获的任何内容。如果文件服务器找不到文件,那么它将以404响应。

答案 1 :(得分:1)

  所有没有以/ meal /开头的请求都应该作为静态服务,例如/ res或(root)/ anyfolder / anyfile

app.use('/share', express.static('share'));使静态处理程序在share/中查找,而不是项目根目录。分享整个根是不常见的,因为人们可以阅读您的源代码。你真的需要服务整个文件夹吗?你可以吗?将res/放在share/内,然后创建一个指向res -> share/res/的符号链接,然后当客户发出请求res/main.js时,express知道要查看share/res/main.js

无论如何@ hexacyanide的代码应该处理你的情况,只需确保订购你的中间件函数,使Express在静态文件之前处理路由函数:

app.use(app.router)
app.use('/share', express.static('share'));

app.get('/meal/:param', function(req, res) {
  // use req.params for parameters
  res.json(/* JSON object here */);
});
// if you want to prevent anything else starting with /meal from going to
// static just send a response: 
//app.get('/meal*', function(req, res){res.send(404)} ); 

app.get('/', function(req, res) {
  res.sendfile('index.html');
});