LADとKOAのためのより良いエラーハンドラー。
ctx.throw素晴らしいものにします(KOA-404ハンドラーで使用するのが最適です)
ETIMEOUTおよびEBADFAMILYなど)を検出し、408クライアントタイムアウトエラーを送信します<ul>を使用してHTMLエラーリストをサポートしますctx.throwを美しいメッセージ(たとえば、 ctx.throw(404)美しいエラーオブジェクトを出力します)text/html 、 application/json 、およびtext応答タイプをサポートしますnpm install --save koa-better-error-handlerおそらくこれをKOA-404ハンドラーと組み合わせて使用する必要があります!
パッケージは、4つの引数を受け入れる関数を(順番に)エクスポートします。
cookiesKeyデフォルトはfalseですlogger - デフォルトはconsoleですuseCtxLoggerデフォルトはtrueになりますstringifyデフォルトはfast-safe-stringifyを使用します( JSON.stringifyまたは別のオプションをここで使用することもできます) cookiesKeyに合格すると、セッションのサポートが追加されます。 Cookieとセッション(Webサーバーなど)を使用している場合は、常にこの引数の値を設定する必要があります。
loggerにキャビンを使用することをお勧めします。また、 ctx.logger自動入力してコンテキストベースのログを簡単に作成できるため、ミドルウェアも使用する必要があります。
このパッケージはkoa-generic-sessionのみをサポートしており、 koa-session-storeをまだサポートしていないことに注意してください(index.jsのコードを参照してください。
セッション、Cookie、またはフラッシュメッセージのサポートはありません:
const errorHandler = require ( 'koa-better-error-handler' ) ;
const Koa = require ( 'koa' ) ;
const Router = require ( 'koa-router' ) ;
const koa404Handler = require ( 'koa-404-handler' ) ;
// initialize our app
const app = new Koa ( ) ;
// override koa's undocumented error handler
app . context . onerror = errorHandler ( ) ;
// specify that this is our api
app . context . api = true ;
// use koa-404-handler
app . use ( koa404Handler ) ;
// set up some routes
const router = new Router ( ) ;
// throw an error anywhere you want!
router . get ( '/404' , ctx => ctx . throw ( 404 ) ) ;
router . get ( '/500' , ctx => ctx . throw ( 500 ) ) ;
// initialize routes on the app
app . use ( router . routes ( ) ) ;
// start the server
app . listen ( 3000 ) ;
console . log ( 'listening on port 3000' ) ;セッション、クッキー、フラッシュメッセージの組み込みサポート:
const errorHandler = require ( 'koa-better-error-handler' ) ;
const Koa = require ( 'koa' ) ;
const redis = require ( 'redis' ) ;
const RedisStore = require ( 'koa-redis' ) ;
const session = require ( 'koa-generic-session' ) ;
const flash = require ( 'koa-connect-flash' ) ;
const convert = require ( 'koa-convert' ) ;
const Router = require ( 'koa-router' ) ;
const koa404Handler = require ( 'koa-404-handler' ) ;
// initialize our app
const app = new Koa ( ) ;
// define keys used for signing cookies
app . keys = [ 'foo' , 'bar' ] ;
// initialize redis store
const redisClient = redis . createClient ( ) ;
redisClient . on ( 'connect' , ( ) => app . emit ( 'log' , 'info' , 'redis connected' ) ) ;
redisClient . on ( 'error' , err => app . emit ( 'error' , err ) ) ;
// define our storage
const redisStore = new RedisStore ( {
client : redisClient
} ) ;
// add sessions to our app
const cookiesKey = 'lad.sid' ;
app . use (
convert (
session ( {
key : cookiesKey ,
store : redisStore
} )
)
) ;
// add support for flash messages (e.g. `req.flash('error', 'Oops!')`)
app . use ( convert ( flash ( ) ) ) ;
// override koa's undocumented error handler
app . context . onerror = errorHandler ( cookiesKey ) ;
// use koa-404-handler
app . use ( koa404Handler ) ;
// set up some routes
const router = new Router ( ) ;
// throw an error anywhere you want!
router . get ( '/404' , ctx => ctx . throw ( 404 ) ) ;
router . get ( '/500' , ctx => ctx . throw ( 500 ) ) ;
// initialize routes on the app
app . use ( router . routes ( ) ) ;
// start the server
app . listen ( 3000 ) ;
console . log ( 'listening on port 3000' ) ; リクエストの例:
curl -H " Accept: application/json " http://localhost/some-page-does-not-exist応答の例:
{
"statusCode" : 404 ,
"error" : " Not Found " ,
"message" : " Not Found "
}v3.0.5の時点で、 no_translateのエラープロパティを設定してtrueの値を持つことにより、エラーが自動的に変換されるのを防ぐことができます。
function middleware ( ctx ) {
const err = Boom . badRequest ( 'Uh oh!' ) ;
err . no_translate = true ; // <----
ctx . throw ( err ) ;
} app.context.api = trueまたはset ctx.api = trueを指定し、複数のメッセージを持つmongoose検証エラーメッセージが発生した場合(たとえば、複数のフィールドが無効でした) - err.message <li>ではなくコンマによって結合されます。
したがって、APIエラーメッセージがMongoose検証のためにHTMLフォーマットされたエラーリストを返したい場合は、 app.context.api = false 、 ctx.api = falseを設定するか、このエラーハンドラーを使用する前にそれらを設定しないようにしてください。
try {
// trigger manual validation
// (this allows us to have a 400 error code instead of 500)
await company . validate ( ) ;
} catch ( err ) {
ctx . throw ( Boom . badRequest ( err ) ) ;
}エラーリストで:
{
"statusCode" : 400 ,
"error" : " Bad Request " ,
"message" : " <ul class= " text-left mb-0 " ><li>Path `company_logo` is required.</li><li>Gig description must be 100-300 characters.</li></ul> "
}エラーリストなし:
{
"statusCode" : 400 ,
"error" : " Bad Request " ,
"message" : " Path `company_logo` is required., Gig description must be 100-300 characters. "
}デフォルトでは、 ctx.apiがtrueの場合、html-tostexはerr.messageで呼び出され、すべてのHTMLマークアップをテキスト形式に変換します。
環境変数のベースURIをprocess.env.ERROR_HANDLER_BASE_URL 、例: ERROR_HANDLER_BASE_URL=https://example.com (omit trailing lash)、および<a href="/foo/bar/baz">Click here</a> [1] with [Click here][1] https://example.com/foo/bar/bazに追加されました。
MIT©Nick Baugh