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