来自express.js,我想为一个小项目尝试
flatiron.然而,有一些小问题使我无法实际到达某个地方.
var flatiron = require('flatiron'),session = require('connect').session,ecstatic = require('ecstatic'),path = require('path'),fs = require('fs'),plates = require('plates'),director = require('director'),winston = require('winston'),union = require('union'); var router = new director.http.Router(); var server = union.createServer({ before: [ ecstatic(__dirname + '/public') ] }); router.get('/',function () { var self = this; fs.readFile('public/layout.html','utf-8',function(err,html) { [...] }) }); server.listen(3000,function () { console.log('Application is now started on port 3000'); });
如何使用导演工作?当我离开ecstatic时,我可以定义像’/’这样的路线并且它可以工作,但是我没有得到静态的CSS和JS内容.使用ecstatic /替换为’index.html’,并且ecstatic优先于所有已定义的路线.
– 这与connect-static的行为相同.路径(/)由index.html替换.
我还尝试了使用连接中间件的不同方法,但这不起作用:
var flatiron = require('flatiron'),connect = require('connect'),app = flatiron.app; app.use(flatiron.plugins.http); app.use(connect.favicon()); app.use(connect.static(__dirname + '/public')); app.use(connect.directory(__dirname + '/public')); app.use(connect.cookieParser('my secret here')); app.use(connect.session({'secret': 'keyboard cat'})); app.router.get('/',function () { console.log("GET /"); var self = this; fs.readFile('public/layout.html',html) { [...] }) }); app.listen(3000,function () { console.log('Application is now started on port 3000'); });
解决方法
我认为关于在flatiron中路由的问题的最佳答案一如既往地在源代码中:
app.server = union.createServer({ after: app.http.after,before: app.http.before.concat(function (req,res) { if (!app.router.dispatch(req,res,app.http.onError || union.errorHandler)) { if (!app.http.onError) res.emit('next'); } }),headers: app.http.headers,limit: app.http.limit });
正如你在这里看到的那样,flatiron将路由器绑定为最后一个请求处理程序,在所有中间件之后调用.如果你在app.http.before中放置’ecstatic’并且它将在工作流程中调度,则不会调用其他中间件.
你的第二段代码表明你没有看出Flatiron的Express(Connect)连接方法之间的区别.我将尝试在此示例中明确说明:
flatironApp.use({ // plugin object name : "pluginName",attach : function(options) { /*code*/ },init : function(done) { /*code*/ done(); } }) connectApp.use(function(req,next) { /* code */ next(); })
如果你想在Flatiron中使用Connect的中间件,你应该将它分别放在app.http.before数组中,如下所示:
// Initiating application app.use(flatiron.plugins.http); // Adding request handlers app.http.before.push( connect.favicon() ); app.http.before.push( ecstatic(__dirname + '/public') );