How to determine the right Accept Content-Type with ExpressJS

╄→гoц情女王★ 提交于 2019-12-13 06:25:05

问题


I'm having trouble to distinguish an ajax call from other calls in ExpressJS.

As far as I understand, I can use request.accepts('json') to identify a json request?

The problem is - apparently, every call accepts everything!

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()
} )

If I just visit the page, it accepts json and html.

If I try to use $.getJSON( ... url ... ), it also acccepts json and 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"

I'm not an expert about the accepts headers, but it seems that the */* part could be the issue.

How can I determine correct (or perhaps, the first) accept type in ExpressJS? Alternatively: How can I distinguish a JSON request from a normal pagevisit?


回答1:


Almost all GET requests made by the browser are finished with */*, it means that it accepts pretty much everything. In order to make a decision, you could check req.accepted array. It looks like this:

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

Thereby, if JSON is present it is a special request, otherwise it is a simple request




回答2:


I've found a solution that seems to work, by using an array for accepts():

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


来源:https://stackoverflow.com/questions/38412980/how-to-determine-the-right-accept-content-type-with-expressjs

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!