Flatiron js - director - 如何从表中执行异步路由?

时间:2012-01-28 04:40:29

标签: node.js flatiron.js

我开始使用flatiron作为网络应用的工具集来设置。

我正在使用app.plugins.http的导演,似乎无法弄清楚如何为静态文件创建一个“catchall”路由&amp; 404s - .get("<RegEx>")似乎只匹配第一个文件夹位置,因此如果<RegEx>/.*,则它将匹配/foo,但不匹配/foo/bar。< / p>

这是我的代码,作为一个更好的例子:

routes.js中的

var routes = {
  /* home
  * This is the main route, hit by queries to "/"
  */
  "/" : {
    get: function(){
      getStatic("html/index.html",_.bind(function(err,content){
        if(err) throw err;
        renderContent(this,content);
      },this));
    }
  },
  /* static files
  * Last rule, if no other routes are hit, it's either a static resource
  * or a 404. Check for the file then return 404 if it doesn't exist.
  */
  '/(.*)' : {
    get : function(){
      getStatic(this.req.url,_.bind(function(err,content){
        if(!err){
          renderContent(this,content);
        } else {
          this.res.writeHead(404);
          // TODO: fancier 404 page (blank currently)
          this.res.end();
        }
      },this))
    }
  }
}

并在我的主应用文件中:

/* Define the routes this app will respond to. */
var routes = require('./lib/routes');
/* set up app to use the flatiron http plugin */
app.use(flatiron.plugins.http);
/* loop through routes and add ad-hoc routes for each one */
for(var r in routes){
    var route = routes[r];
    if(!routes.hasOwnProperty(r)) continue;
    for(var method in route){
        if(!route.hasOwnProperty(method)) continue;
        app.router[method](r,route[method]);
    }
}
/* Start the server */
app.listen(8080);

我希望能够将我的路线保存在一个单独的模块中并导入它们 - 我很不清楚这种方法或使用导演和vanilla http服务器是否会更好,但我已经尝试过两种方式没有任何运气。

这是我得到的:

localhost:8080/
>> (content of index file - this works)
localhost:8080/foo
>> (blank page, 404 header)
localhost:8080/foo/bar
>> (no static file for this - I get a 404 header, but the body is now "undefined" - where is this coming from??)
localhost:8080/css/min.css
>> (this file should exist, but the route is never called. I do however still get a 404 header, and get the "undefined" body)

所以,我假设“未定义”主体是未定义路由的默认行为。

有没有办法在不为每个深度添加规则的情况下创建一个catchall路线?

2 个答案:

答案 0 :(得分:2)

您可以尝试使用node-ecstatic,它是flatiron的静态文件服务附加组件。它适用于我,你可以在:

找到它

https://github.com/colinf/node-ecstatic

答案 1 :(得分:2)

尝试使用onError:

app.use(flatiron.plugins.http,{
    onError: function (err) {   
        this.res.end('Nope');
    }
});

要管理您的静态文件,我建议您使用flatiron / union + connect.static