Express.jsインスタンスといくつかの機能をラップしたいカップルのルートがあります。例:Express.js - 「デコレータ」内のすべてのミドルウェア/ルートをラップします
const wrapper = (route) => {
return (req, res, next) => {
let result = route(req, res, next);
// do some independent processing
}
};
app.get('/', wrapper((req, res, next) => {
// respond to request somehow
}));
これが正常に動作している間、私は明示的にこのような処理を必要とするすべてのルートやミドルウェアにwrapper
を呼び出すためのアイデアを好きではありません。 Express.js
延長、サル・パッチの適用や、いくつかの特別な経て、暗黙的に
(wrapper
関数は、このルート/ミドルウェアをラップする必要があることを確認することができますことを考えると)特定のラッパー内のすべての必要なルート/ミドルウェアをラップすることができるようにする方法はあります(ミドルウェア)?
UPDATE:
より固体の例。ルータの機能をasync
にしたいとしましょう。しかし、私は各ルート機能でエラーをキャッチしたくありません。だから私は彼らを包む:すべてのルートの周り
const wrapper = func => (req, res, next) => {
const promise = func(req, res, next);
if (promise.catch) {
promise.catch(err => next(err));
}
next();
};
app.get('/one', wrapper(async (req, res, next) => {
// respond to request somehow
}));
app.get('/two', wrapper(async (req, res, next) => {
// respond to request somehow
}));
app.get('/three', wrapper(async (req, res, next) => {
// respond to request somehow
}));
// and so on...
app.use((err, req, res, next) => {
// do something with intercepted error
});
これ明示wrapper
は、実際に私はを取り除きたいものです。
ようREQ上のものを追加することができます
は、いくつかのコードを実行するためにあなたの究極の目標ですか? – robertklep
いいえ、私の目標はルータ機能を装飾しているので、私は直接応答の結果を得ることができます(例えばPromiseを返す)。 – Nevertheless