0

我无法将 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 请求和正常的页面访问?

4

2 回答 2

0

浏览器发出的几乎所有 GET 请求都以 结尾*/*,这意味着它几乎可以接受所有内容。为了做出决定,您可以检查req.accepted数组。它看起来像这样:

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

因此,如果存在 JSON,则为特殊请求,否则为简单请求

于 2016-07-16T16:40:45.620 回答
-1

我找到了一个似乎可行的解决方案,方法是使用数组accepts()

if( request.accepts( [ 'json', 'html' ] ) == 'json' ) {
    // do something
} else {
    // do something else
}
于 2016-07-17T07:47:24.617 回答