gpt4 book ai didi

javascript - flatiron.js 使用 union、director 和 plates 进行路由和模板化?

转载 作者:数据小太阳 更新时间:2023-10-29 04:42:54 26 4
gpt4 key购买 nike

来自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');
});

director 的路由是如何工作的?当我离开时ecstatic out,我可以定义像'/'这样的路由并且它有效,但是我没有得到静态CSS和JS内容。使用 ecstatic/替换为 'index.html' 并且 ecstatic 优先于所有定义的路由。 - 这与静态连接的行为相同。路由 (/) 替换为 index.html。

我还尝试了一种使用连接中间件的不同方法,但它不起作用:

var flatiron = require('flatiron')
, connect = require('connect')
, path = require('path')
, fs = require('fs')
, plates = require('plates')
, 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', 'utf-8', function(err, html) {
[...]
})
});

app.listen(3000, function () {
console.log('Application is now started on port 3000');
});

最佳答案

我认为有关熨斗中路由问题的最佳答案一如既往地在源代码中:

     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
});

正如您在这里看到的,熨斗将路由器绑定(bind)为最后一个请求处理程序,在所有中间件之后调用。如果您将 'ecstatic' 放在 app.http.before 中,它将在工作流期间被调度,则不会调用其他中间件。

您的第二个代码块表明您没有理解 Flatiron 的 .use() 方法与 Express/Connect 的区别。我将尝试在这个例子中说清楚:

    flatironApp.use({
// plugin object
name : "pluginName"
, attach : function(options) {
/*code*/
}
, init : function(done) {
/*code*/
done();
}
})

connectApp.use(function(req, res, 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') );

关于javascript - flatiron.js 使用 union、director 和 plates 进行路由和模板化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9767099/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com