Sailsアプリケーションには、アクションコードから呼び出すことができるいくつかの事前設定されたレスポンスがバンドルされています。これらのデフォルトレスポンスは、「リソースが見つかりません」(notFound
レスポンス)や「内部サーバーエラー」(serverError
レスポンス)などの状況を処理できます。アプリケーションでデフォルトレスポンスの動作を変更したり、まったく新しいレスポンスを作成する必要がある場合は、api/responses
フォルダにファイルを追加することで実現できます。
注記: 新しいSailsアプリケーションでは、
api/responses
はデフォルトで生成されません。レスポンスを追加またはカスタマイズする場合は、自分で追加する必要があります。
簡単な例として、次のアクションを考えてみましょう。
getProfile: function(req, res) {
// Look up the currently logged-in user's record from the database.
User.findOne({ id: req.session.userId }).exec(function(err, user) {
if (err) {
res.status(500);
return res.view('500', {data: err});
}
return res.json(user);
});
}
このコードは、データベースエラーを処理するために500エラーステータスを送信し、エラーデータをビューに送信して表示します。しかし、このコードにはいくつかの欠点があります。主に以下の点です。
次に、この代替案を考えてみましょう。
getProfile: function(req, res) {
// Look up the currently logged-in user's record from the database.
User.findOne({ id: req.session.userId }).exec(function(err, user) {
if (err) { return res.serverError(err); }
return res.json(user);
});
}
このアプローチには多くの利点があります。
api/responses/
フォルダに保存されている任意の.js
ファイルは、res.thatFileName()
を呼び出すことで実行できます。たとえば、api/responses/insufficientFunds.js
はres.insufficientFunds()
を呼び出すことで実行できます。
req
、res
、およびsails
へのアクセスリクエストとレスポンスオブジェクトは、カスタムレスポンス内でthis.req
とthis.res
として使用できます。これにより、実際のレスポンス関数が任意のパラメータを受け取ることができます。例えば
return res.insufficientFunds(err, { happenedDuring: 'signup' });
そして、カスタムレスポンスの実装は次のようになります。
module.exports = function insufficientFunds(err, extraInfo){
var req = this.req;
var res = this.res;
var sails = req._sails;
var newError = new Error('Insufficient funds');
newError.raw = err;
_.extend(newError, extraInfo);
sails.log.verbose('Sent "Insufficient funds" response.');
return res.badRequest(newError);
}
すべてのSailsアプリケーションには、res.serverError()
やres.notFound()
などのいくつかの事前設定されたレスポンスがあり、api/responses/
に対応するファイルがなくても使用できます。
デフォルトレスポンスは、同じ名前のファイルをアプリケーションのapi/responses/
に追加することで上書きできます(例:api/responses/serverError.js
)。
Sailsコマンドラインツールを使用すると、これを簡単に実行できます。
例えば
sails generate response serverError