Sailsjs:基于请求参数设置响应方法
问题描述:
所以我一直在使用Sailsjs
来处理SPA
项目。问题是:Sailsjs:基于请求参数设置响应方法
当第一页加载时,我在我的控制器中使用res.view
或res.render
。但是,对于后续请求,我不想使用res.view
或res.render
,而是我想使用res.json
。
现在,我使用的方法:
return req.param('json') ? res.json(myObj) : res.view('layout', myObj);
这工作,但我一直在寻找在我的控制器本身会知道一个更通用的抽象方法(的req.param('json')
的基础上)是否使用res.view
或res.json
而不必明确告诉它。
任何帮助吗?
答
这是res.ok()
的用途。
在下面的控制器动作,res.ok
要么显示myAction.ejs使用data
作为视图本地人,或与data
响应作为JSON,取决于请求如何进来(即通过AJAX,插座或常规浏览器请求):
module.exports = {
myAction: function(req, res) {
var data = {someKey: "someVal"};
return res.ok(data);
}
}
内部,ok
响应使用req.wantsJSON
来决定做什么;它会检查标题,查找xhr
对象,并且一般会尽力猜测您的意图。 req.wantsJSON
适用于所有请求(因为是req.isSocket
),所以您可以根据需要自己使用它们。
答
所以经过一些修补之后,我使用服务解决了这个问题。
我写了一个服务(在GlobalUtils.js):
render: function (req, res, obj) {
if(req.param('json')) {
return res.json(obj);
}
else {
return res.view('layout', obj);
}
}
而且我在控制器上使用这项服务,就像这样:
return GlobalUtils.render(req, res, myObj);
但尽管如此,寻找一个更好的方法。
感谢您的回答。我读了res.ok [这里](https://github.com/balderdashy/sails/blob/master/lib/hooks/responses/defaults/ok.js)。由于我正在制作SPA应用程序,该应用程序将呈现服务器的第一页,因此我总是必须提供'layout.ejs'参数,因为任何页面都可以成为第一页。另外,我的json请求将通过AJAX或socket来实现。 'req.wantsJSON'行为可靠吗? – myusuf 2014-09-06 14:18:20
除非使用** views/layout.ejs **之外的布局模板,否则不应指定布局。至于'wantsJSON',是的,在这两种情况下它都会返回true。你可以检查它的代码[这里](https://github.com/balderdashy/sails/blob/f8870e796c22f5f9e39fb9d7c0047d73c82b157e/lib/hooks/request/qualifiers.js) – sgress454 2014-09-08 06:33:29
我发现,如果我不提供布局,那么默认情况下它不需要** views/layout.ejs **。相反,它会在控制器文件夹中显示操作的名称。所以,如果我在UserController和配置文件操作中,那么默认情况下会渲染** user/profile.ejs **。 – myusuf 2014-09-09 09:39:54