2
  • Sails.js v0.9.4
  • Node.js v0.10.18
  • Express.js v3.2.6

私は帆の単純な Web アプリケーションを作成しました。ServerResponse次のような一般的なエラー応答のプロトタイプに新しい関数を追加したいと思います。

UtilService.js

require('http').ServerResponse.prototype.returnError = function (message) {
    console.error("Error: " + message);
    return this.view("./error", { errors: [{ stack: message }] });
};

FooController.js

require("../services/UtilService");

上記のコードはうまく機能します。ただし、すべてのコントローラーに同じスニペットを書き込むわけではありません。どうすればDRYに保つことができますか? つまり、拡張コードの上にどのファイルを記述すればよいのでしょうか。


2013-09-25 09:26 UTC に追加

アドバイスや提案をありがとう。config/bootstrap.jsプロトタイプを変更するためのコードを 1 回だけ実行したいので、特別なロジックを追加しました。これはうまく機能しているようです。

config/bootstrap.js

module.exports.bootstrap = function (cb) {
  cb();
  require('http').ServerResponse.prototype.returnError = function (message) {
    console.error("Error: " + message);
    return this.view("./error", { errors: [{ stack: message }] });
  };
};
4

2 に答える 2

2

アドバイスや提案をありがとう。config/bootstrap.jsプロトタイプを変更するコードを一度だけ実行したいので、特別なロジックを追加しました。これはうまく機能しているようです。

config/bootstrap.js

module.exports.bootstrap = function (cb) {
  cb();
  require('http').ServerResponse.prototype.returnError = function (message) {
    console.error("Error: " + message);
    return this.view("./error", { errors: [{ stack: message }] });
  };
};
于 2013-09-27T06:12:35.847 に答える
0

ヘキサシアニドが示唆するように「ルートで」プロトタイプを拡張するには、高速ミドルウェアを変更する必要があるため、これはポリシーを使用するのに適した場所のようです。これはお勧めできません。

代わりに、config/policies.jsすべてのアクションにデフォルト ポリシーを追加してみてください。

someController: {
  '*': httpPrototype
}

httpPrototype ポリシーは次のようになります。

module.exports = function httpPrototype (req, res, next) {
  require('http').ServerResponse.prototype.returnError = function (message) {
    console.error("Error: " + message);
    return this.view("./error", { errors: [{ stack: message }] });
  };
  next();
};
于 2013-09-24T16:31:04.903 に答える