0

ExpressJS에서 다른 호출과 ajax 호출을 구별하는 데 문제가 있습니다.ExpressJS에서 올바른 수락 콘텐츠 형식을 결정하는 방법

내가 이해하는 한, request.accepts('json')을 사용하여 json 요청을 식별 할 수 있습니까?

문제는 - 분명히 모든 전화가 모든 것을 허용합니다!

app.get('*', function(request, response, next) { 
    console.log('request accepts:') 

    if(request.accepts('json')){ 
     console.log('--> accepts json') 
    } 
    if(request.accepts('html')){ 
     console.log('--> accepts html') 
    } 
    if(request.accepts('blah')){ 
     console.log('--> accepts blah') // this does not show up 
    } 
    if(request.accepts('application/json')){ 
     console.log('--> accepts json2') 
    } 

    next() 
}) 

방금 ​​페이지를 방문하면 json과 html을 사용할 수 있습니다.

$.getJSON(... url ...)을 사용하려고하면 json과 html도 인식합니다.

Headers: 

Browser: "Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" 
Ajax: "Accept application/json, text/javascript, */*; q=0.01" 

본인은이 헤더를 수락에 대해 전문가가 아니지만, */* 부분이 문제가 될 수 있음을 보인다.

ExpressJS에서 올바른 (또는 아마도 첫 번째) 수락 유형을 어떻게 결정합니까? 또는 JSON 요청을 일반 페이지 뷰와 구분하는 방법은 무엇입니까?

+0

왜 처음부터 이렇게해야할까요? 동일한 URL에서 다른 데이터 유형을 제공해야하는 경우 대부분의 API는'/ path/to/server? format = json'과 같은 쿼리 매개 변수를 사용합니다. – charlietfl

+0

@charlietfl 경로 주체없는 미들웨어가 있기 때문에이 주된 이유가 있습니다. 모든 경우에 호출 됨) json 기반 호출 중에는 비활성화하려고합니다. 경로 라우팅이 이후에 발생하는 것 같기 때문에, 플래그를 설정할 수 없습니다 (너무 늦었 기 때문에). 2 가지 옵션을 볼 수 있습니다 : 라우팅을 시뮬레이트하는 미들웨어를 만들고 특정 경로 (meh!)가 호출되었는지 확인하거나 단순히 허용 된 유형을 확인하십시오. – Katai

+0

json에게만 서비스하는 REST API가 있다고 가정하면 경로에''/ api/"'와 같은 api의 주 경로가 포함되어 있는지 확인할 수 없습니다. 이상한 문제가있는 것 같습니다. – charlietfl

답변

0

브라우저에서 작성한 거의 모든 GET 요청은 */*으로 끝납니다. 이는 거의 모든 것을 수용한다는 의미입니다. 결정을 내리기 위해서 req.accepted 배열을 점검 할 수 있습니다. 그것은 다음과 같습니다

[ { value: 'application/json', 
    quality: 1, 
    type: 'application', 
    subtype: 'json' }, 
{ value: 'text/html', 
    quality: 0.5, 
    type: 'text', 
    subtype: 'html' } ] 

을 따라서, JSON이 특별한 요청입니다있는 경우, 그렇지 않으면 내가 작동하는 것 같다 해결책을 발견했습니다

-1

간단한 요청은, 배열에 대한을 사용하여 accepts() :

if(request.accepts([ 'json', 'html' ]) == 'json') { 
    // do something 
} else { 
    // do something else 
}