Sailsjs:基于请求参数设置响应方法

问题描述:

所以我一直在使用Sailsjs来处理SPA项目。问题是:Sailsjs:基于请求参数设置响应方法

当第一页加载时,我在我的控制器中使用res.viewres.render。但是,对于后续请求,我不想使用res.viewres.render,而是我想使用res.json

现在,我使用的方法:

return req.param('json') ? res.json(myObj) : res.view('layout', myObj);

这工作,但我一直在寻找在我的控制器本身会知道一个更通用的抽象方法(的req.param('json')的基础上)是否使用res.viewres.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),所以您可以根据需要自己使用它们。

+1

感谢您的回答。我读了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

+0

除非使用** views/layout.ejs **之外的布局模板,否则不应指定布局。至于'wantsJSON',是的,在这两种情况下它都会返回true。你可以检查它的代码[这里](https://github.com/balderdashy/sails/blob/f8870e796c22f5f9e39fb9d7c0047d73c82b157e/lib/hooks/request/qualifiers.js) – sgress454 2014-09-08 06:33:29

+0

我发现,如果我不提供布局,那么默认情况下它不需要** views/layout.ejs **。相反,它会在控制器文件夹中显示操作的名称。所以,如果我在UserController和配置文件操作中,那么默认情况下会渲染** user/profile.ejs **。 – myusuf 2014-09-09 09:39:54

所以经过一些修补之后,我使用服务解决了这个问题。

我写了一个服务(在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);

但尽管如此,寻找一个更好的方法。