node.js express:如何知道请求是 AJAX 请求?

6

假设我有一小段代码:

var express = require('express');
var app = express();

app.get('/', function(req, res){
  //I want to acccess 'req' and get info whether it's an AJAX call
});

app.listen(3000);

当我进入app.get(..)函数时,我想知道发送的get请求是否是一个AJAX调用。在对象'req'中,有哪个字段可以告诉我这一点?


1
var isAjax = req.xhr; - Omidam81
可能是重复问题 https://dev59.com/h2Mk5IYBdhLWcg3w3xhY - Anton Grigorov
在请求XHR时添加一个参数即可。 - modernator
顺便问一下,你有没有一个链接可以提供关于Express中req对象的所有字段信息? - CrazySynthax
1
请查看此链接:http://expressjs.com/en/4x/api.html#req - modernator
谢谢。这正是我正在寻找的。 - CrazySynthax
3个回答

10

HTTP头X-Requested-With: XMLHttpRequest不会自动添加到使用fetch或旧式的XMLHttpRequest对象进行的AJAX请求中。通常由客户端库(如jQuery)添加。

如果存在此标头,则在Express中表示为request.xhr

如果要将其添加到请求中(解决此问题的最简单方法),可以使用fetch将其添加为自定义标头:

fetch(url, {
    headers: {
        "X-Requested-With": "XMLHttpRequest"
    }
});

现在req.xhr将反映这一点。

一个更好的解决方案是将Accept头设置为合理的值。如果你想返回JSON格式的数据,请将Accept设置为application/json

fetch(url, {
    headers: {
        "Accept": "application/json"
    }
});

然后,您可以使用 req.accepts 进行测试:

switch (req.accepts(['html', 'json'])) { //possible response types, in order of preference
    case 'html':
        // respond with HTML
        break;
    case 'json':
        // respond with JSON
        break;
    default:
        // if the application requested something we can't support
        res.status(400).send('Bad Request');
        return;
}

这比使用req.xhr方法更加强大。


4
app.get('/', function(req, res){
  //I want to acccess 'req' and get info whether it's an AJAX call
  if(req.xhr){
     //the request is ajax call
  }
})

@lonesomeday 如果是这种情况,你必须手动设置头部 X-Requested-With: XMLHttpRequest,这样就可以工作了。 - Suman Kundu
@SumanKandu 或者其他更合适的方法,比如 Accepts 头部。 - lonesomeday

1
var express = require('express');
var app = express();

app.get('/', function(req, res){
  var isAjax = req.xhr;
});

app.listen(3000);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接