モデルメソッドまたはヘルパーへの呼び出しが失敗した場合、Sails は JavaScript Error インスタンス をスローします。このプロパティは、何が間違っていたかを診断するのに役立ちます。
Waterline はこれらの Error インスタンスを正規化し、一貫性のある err.name
値で分類し、適用可能な場合は err.code
も分類します。
try {
await Something.create({…});
} catch (err) {
// err.name
// err.code
// …
}
包括的なエラー処理は、何もないよりはましですが、多くの場合、十分ではありません。(「無効なユーザー名です」と「現在、新しいユーザーを作成できません」の間には大きな違いがあります。)さまざまな種類のエラーを適切に処理するには、詳細にエラーを検査する必要があります。
幸いにも、Sails は try...catch を使用せずに、これをすぐに実行するための構文糖を提供します。 .intercept() と .tolerate() です。
await Something.create({…})
.intercept((err)=>{
// Return a modified error here (or a special exit signal)
// and .create() will throw that instead
err.message = 'Uh oh: '+err.message;
return err;
});
プロパティ | 型 | 詳細 |
---|---|---|
name | エラーの大まかな分類。 例: 'UsageError' |
|
message | .message を参照してください。 | |
stack | .stack を参照してください。 | |
code | 場合によっては含まれる、より詳細なエラー分類。 例: 'E_UNIQUE' |
Waterline と対話するコード(通常はモデルメソッドを介して)を使用する場合、発生する可能性のあるエラーの種類はいくつかあります。
エラーに name: 'UsageError'
がある場合、これは Waterline メソッドが正しく使用されていないか、無効なオプションで実行されたことを示しています(たとえば、モデルの上位レベルの検証ルールに違反する新しいレコードを作成しようとした場合など)。
この種のエラーは、どのモデルメソッドからも発生する可能性があります。
err.name === 'UsageError'
アダプターエラーは通常、リクエスト自体ではなく、基盤となるアダプターの問題を示しています。これは、データベースがオフラインになった場合、権限の問題がある場合、データベース固有のエッジケースがある場合、または(まれに)アダプターのバグがある場合に発生します。この種のエラーには name: 'AdapterError'
があります。
この種のエラーは、どのモデルメソッドからも発生する可能性があります。
err.name === 'AdapterError'
一意性のエラーは、一意であるべき値がデータベース内の別のレコードの値と一致する場合に発生します。これはアダプターエラーと見なされますが、通常のアダプターエラーと区別するために独自の code
があります:code: 'E_UNIQUE'
。
この種のエラーは、.create()
、.update()
、.addToCollection()
、および .replaceCollection()
モデルメソッドからのみ発生する可能性があります。
err.code === 'E_UNIQUE'
Sails アプリでこれを行うために使用する正確な戦略は、await
、Promise、またはコールバックのいずれを使用しているかによって異なります。
await
を使用したエラー処理アクション内から新しいユーザーを作成しようとしたときに発生する可能性のあるさまざまなエラーを処理するには
await User.create({ emailAddress: inputs.emailAddress })
// Uniqueness constraint violation
.intercept('E_UNIQUE', (err)=> {
return 'emailAlreadyInUse';
})
// Some other kind of usage / validation error
.intercept({name:'UsageError'}, (err)=> {
return 'invalid';
});
// If something completely unexpected happened, the error will be thrown as-is.
return exits.success();
Node.js <= v7.9 を使用しているため await
を使用できない場合は、準備してください。 コールバックまたはPromiseチェーン を await
の代わりに使用する場合、エラー処理は少し異なります。
可能な限り
await
を使用してください!アプリの安全性が高まり、コードがクリーンになり、満足度も向上します。
たとえば、Promiseチェーンを使用している場合、新しいユーザーを作成しようとしたときに発生する可能性のあるさまざまなエラーを処理する方法は次のとおりです。
User.create({
emailAddress: req.param('emailAddress')
})
.then(function (){
res.ok();
})
// Uniqueness constraint violation
.catch({ code: 'E_UNIQUE' }, function (err) {
res.sendStatus(409);
})
// Some other kind of usage / validation error
.catch({ name: 'UsageError' }, function (err) {
res.badRequest();
})
// If something completely unexpected happened.
.catch(function (err) {
res.serverError(err);
});
これは同じ例ですが、Promiseチェーンではなく従来の Node.js コールバックで記述されています。
User.create({
emailAddress: req.param('emailAddress')
})
.exec(function (err){
if (err && err.code === 'E_UNIQUE') {
return res.sendStatus(409);
} else if (err && err.name === 'UsageError') {
return res.badRequest();
} else if (err) {
return res.serverError(err);
}
return res.ok();
});
しかし、キャッチされない例外 に注意してください!