4

我正在学习使用 Express。我想要做:

app.configure(function(){
  app.set('views', __dirname + '/views');
  app.set('view engine', 'jade');
  app.set('view options', { layout: false });    /* asterisk */
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(app.router);                           /* dagger */
  app.use(express.static(__dirname + '/public'));
});

app.configure('development', function(){
  app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
  app.use(express.logger('dev'));
  app.set('view options', { pretty: true });     /* asterisk */
});

我做的补充是:

  • 对 Jade 使用 'layout:false'。
  • 在 Jade 中漂亮地打印 HTML。
  • 打开记录器,使用“开发”格式

有两个问题:

  1. /* asterisk */当我设置 'pretty: true' 时,我会覆盖我以前的选项,而不是添加它们。即,除非我添加{ pretty: true, layout: false }感觉多余且不正确的程序,否则我的程序会中断。如何更正它以便我只“修改”视图选项,而不是“定义”它们?

  2. /* dagger */记录器不承认我的请求,除了/favicon.ico. 我发现如果我删除该app.use(app.router);行,那么我会同时看到//favicon.ico。这里发生了什么?

4

2 回答 2

5

从 Express 3.x 开始,使用app.set('view options')不再是正确的方法。 https://github.com/visionmedia/express/wiki/Migrating-from-2.x-to-3.x 这些选项现在在您的app.js使用app.locals中设置为

app.locals.pretty = true;

或为 ejs 设置自定义分隔符

app.locals.open = '}}';
app.locals.close = '{{';
于 2014-07-04T01:50:40.420 回答
2

我签入了 express 源代码,该app.set函数只是在它拥有的任何先前值之上分配。要获得您正在寻找的行为,您必须view options在后续调用中合并该对象。这意味着您可能必须跳过几个圈。connect 包有一个合并功能,可以解决这个问题,但要获得它,你必须将它包含在你的package.json:

"dependencies": {
  "express": "2.5.5"
, "jade": ">= 0.0.1"
, "connect": "1.X"
}

您需要utils从连接中获取对象:

var utils = require('connect').utils;

app.set(option)没有值返回选项的当前设置,因此第二次设置view option时可以这样做:

app.set('view options', utils.merge(app.set('view options'), { pretty: true }));

至于您在使用记录器时遇到的问题,请记住 app.use 正在将中间件添加到堆栈中。在处理请求时,它会按照最初配置的顺序调用每个中间件,有时如果一个中间件能够履行其职责,它不会将控制权传递给堆栈中的后续中间件。

当中间件满足对随后未运行的urlrouter的请求时,就是这种情况。请求出现在日志流中的原因是没有一个中间件能够完成它(如果你有一个文件,中间件就会完成)并且处理落到中间件。'/'loggerfavicon.icostaticpublic/favicon.icologger

为了使您的示例工作,您需要在logger中间件之前在堆栈中更早地定义router中间件。

于 2012-04-23T06:48:09.007 回答