53. middleware を作る

JavaScript

少し工夫が必要  - accepted / - tried

Express Middleware を使ったことありますか?

Middleware関数は同じインタフェースを持ち、順番通りに実行される。

app.use('/user/:id', function (req, res, next) {  next()}, function (req, res, next) {  next(new Error('sth wrong'))})

なのでMiddleware Systemを実装してください!

type Request = objecttype NextFunc =  (error?: any) => voidtype MiddlewareFunc =   (req: Request, next: NextFunc) => voidtype ErrorHandler =   (error: Error, req: Request, next: NextFunc) => voidclass Middleware {  use(func: MiddlewareFunc | ErrorHandler) {    // do any async operations    // call next() to trigger next function  }  start(req: Request) {    // trigger all functions with a req object  }}

上記の実装終わったら、Expressのような使い方が可能になる。

const middleware = new Middleware()middleware.use((req, next) => {   req.a = 1   next()})middleware.use((req, next) => {   req.b = 2   next()})middleware.use((req, next) => {   console.log(req)})middleware.start({})// {a: 1, b: 2}

use() がErrorHandlerをサポートするのにご注意ください。ErrorHandlerに三つの引数があり、Middleware 関数の中にエラーが発生する時、またはnext()に引数が渡されるときに実行される。

const middleware = new Middleware()// throw an error at first functionmiddleware.use((req, next) => {   req.a = 1   throw new Error('sth wrong')    // or `next(new Error('sth wrong'))`})// since error occurs, this is skippedmiddleware.use((req, next) => {   req.b = 2})// since error occurs, this is skippedmiddleware.use((req, next) => {   console.log(req)})// since error occurs, this is calledmiddleware.use((error, req, next) => {   console.log(error)   console.log(req)})middleware.start({})// Error: sth wrong// {a: 1}

関連するリスト

Ideas and Concepts

常にもっといい方法を求めよう。