0

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을 사용하십시오.

어떤 도움이 필요합니까?

답변

2

이것은 res.ok()을위한 것입니다. 아래의 컨트롤러 액션에서

, res.ok (예를 통해 AJAX, 소켓 또는 정기적를이보기 지역 주민으로 data를 사용하여 myAction.ejs를 표시하거나 요청이 온 방법에 따라, JSON으로 data로 응답 중 브라우저 요청) : 내부적으로

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 또는 소켓을 통해 이루어집니다. 'req.wantsJSON'는 안정적으로 동작합니까? – myusuf

+0

** views/layout.ejs ** 이외의 레이아웃 템플릿을 사용하지 않는 한 레이아웃을 지정하지 않아도됩니다. 'wantsJSON'에 관해서는 그렇습니다. 두 상황 모두에서 'true'를 리턴 할 것입니다. 당신은 그것을위한 코드를 확인할 수 있습니다. (여기) (https://github.com/balderdashy/sails/blob/f8870e796c22f5f9e39fb9d7c0047d73c82b157e/lib/hooks/request/qualifiers.js) – sgress454

+0

내가 레이아웃을 제공하지 않으면 그것을 발견했다. , 기본적으로 ** views/layout.ejs **를 사용하지 않습니다. 오히려, 컨트롤러 폴더에서 동작의 이름으로 뷰를 가져옵니다. 그래서, UserController와 profile 액션에 있다면, 기본적으로 sails는 ** user/profile.ejs **를 렌더링합니다. – myusuf

0

약간의 조작을 한 후에 서비스를 사용하여 해결했습니다.

나는 ( 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);

하지만 여전히 찾고 더 나은 방법.

관련 문제