3

Express.js 2.5.8 を使用しています。重複を減らすために、動的ヘルパーを使用して、一般的に使用されるオブジェクトを各ルート内で明示的にレンダリングせずにビューに渡すことを検討しています。

ビューに向かう途中で地元の人々を傍受する方法についてソースを調べましたが、あまり成功していません. app.dynamicViewHelpers オブジェクトをチェックすることで、それらの存在を確認できる可能性があります。ただし、これを実現する実装依存の少ない方法があるかどうかを知りたいです。

理想的な解決策は、値とオブジェクトがどのようにビューに渡されるかにとらわれないことです。それらがviewHelper、ミドルウェア、またはルート自体からのものであるかどうかにかかわらず、テストは変更なしで合格するはずです。とにかくそれが理想です。他のアプローチで解決します。

私がテストしようとしているものの緩い例:

app.dynamicHelpers({
  example : function(req, res){
    return "Example Value";
  }
});

app.get('/example', function(req, res){
  res.render('example-view', {
    sample : "Sample Value"
  });
});

// test that example === "Example Value" in the view
// test that sample === "Sample Value" in the view
4

1 に答える 1

0

これは本当に素晴らしい質問です。これを行う最善の方法は、Express のビュー システムを利用することだと思います。Express 2 を使用している場合は、次のようになります。

var express = require('express');
var app = express.createServer();

express.view.compile = function (view, cache, cid, options) {
  // This is where you get the options as passed to the view
  console.log(options);

  return {
    fn: function () {}
  };
};

app.locals({
  passed_via_locals: 'value'
});

app.get('/', function (req, res, next) {
  res.render('index', {
    passed_in_render: 'value',
    layout: false
  });
});

app.listen('./socket');

var http = require('http');

http.get({socketPath: './socket'});

Express 3 では、これがはるかに簡単になります。

var express = require('express');
var app = new express();

function View() {
  this.path = true;
};
View.prototype.render = function(options, cb) {
  // This is where you get the options as passed to the view
  console.log(options);
};
app.set('view', View);

app.locals({
  passed_via_locals: 'value'
});

app.render('index', {
  passed_in_render: 'value'
});
于 2013-08-01T09:04:48.900 に答える