http://expressjs.com/ja/guide/writing-middleware.html
authorization headerの取り出し方
https://gist.github.com/thebigredgeek/230368bd92aa19e3f6638b659edf5cef
router
https://qiita.com/tamura_CD/items/e3abdab9b8c5aa35fa6b
REST API を作ってみたが、結構入り組んでしまったので修正
Errorクラスはそのままでは継承できない
Promiseの中でエラーが起きたら reject( new 何らかのエラー() )
のようにエラーを投げ、後で catch
の中で分類して、種類ごとに応答を変えようとした。
this.users.register( name, password )
.then( ( uid ) => {
// registration succeeded
let token = this.generateToken( uid );
res.status( 200 ).json( { token: token } );
} ).catch( err => {
if( err instanceof AuthError.AuthorizationFailed ) {
// duplicate username -> conflict error
res.status( 409 ).json( { message: 'failed' } );
} else {
// Unknown error
res.status( 500 ).json( { message: 'failed' } );
}
} );
しかし、Errorクラスを使って以下のようにいくつか派生型のErrorクラスを定義してみたが、うまく instanceof
で分類することができなかった。全て Errorクラスだと認識されてしまうようだった。
export module AuthError {
export class AuthorizationFailed extends Error{}
export class UsernameAlreadyExists extends Error{}
export class ValidationFailed extends Error{}
}
https://stackoverflow.com/questions/31089801/extending-error-in-javascript-with-es6-syntax-babelで調べてみると、Node.jsに組み込まれたErrorクラスは継承してもうまく instanceof で分類できないようだった。拡張可能なErrorクラスを作れば解決するらしく、npm で提供されている es6-error モジュール (https://www.npmjs.com/package/es6-error\)が利用できることが分かった。
以下のようにして、やりたいことができた。
import ExtendableError from 'es6-error';
export module AuthError {
export class AuthorizationFailed extends ExtendableError{}
export class UsernameAlreadyExists extends ExtendableError{}
export class ValidationFailed extends ExtendableError{}
}