【问题标题】:Node.js Doesn't Recognize Ajax RequestNode.js 无法识别 Ajax 请求
【发布时间】:2018-12-10 05:17:03
【问题描述】:

我正在尝试创建一个专用于 Ajax 请求的私有页面。这是简单的请求。

window.onload = loaded;

function loaded(){
    var xhr = new XMLHttpRequest();
    xhr.open('GET', '/data_annotations', true);
    xhr.onload = function(){
        if(this.status == 200){
            var data = xhr.responseText;
            console.log(JSON.parse(data));
        } else {
            console.log("Rip");
        }
    }
    xhr.send(); 
    //httpreq.abort();
}

这是它运行的 node.js:

...
app.get('/', function(req, res, next){
    console.log("Connected Successfully.");
    res.render('home');
});

app.get('/data_annotations', function(req, res, next){
    if(req.xhr || req.headers.accept.indexOf('json') > -1) {
        const mc = mongo.MongoClient;  
        const url = 'mongodb://localhost:27017/';
        const dbName = 'practiceMDB';
        console.log("Got Data Annotations.");

        mc.connect(url, { useNewUrlParser: true }, (err, client) =>{
            if(err){
                console.log(err);
            } else {
                const db = client.db(dbName);
                data = db.collection('DataAnnotations');
                data.find({}).toArray(function(err, data){
                    res.send(data)
                });
                client.close();
            }
        });
    } else {
        res.redirect('/');
    }  
});

app.listen(port, function(){
    console.log('Server Started on Port '+port);
});

我只希望 /data_annotaion 来自 Ajax 请求时运行。如果用户在 url 中输入 /data_annotations,它应该将他们重定向到主页。当我运行它时,我得到了这些结果:

Server Started on Port 3000
Connected Successfully.
Connected Successfully.

这表明(对我而言)ajax 请求没有注册为 ajax 请求,而是注册为正常请求。此外,我收到此错误:

Uncaught SyntaxError: Unexpected token < in JSON at position 0

我相信这是由于重定向。 Ajax 请求被重定向,它获取主页的响应并且无法解析它(我相信这是因为它无法解析 HTML 文本或字符串文本 - 不要引用我的话)。如何让 Node JS 注册我的 Ajax 请求?

PS:我查看了这个答案以确定请求是否是 Ajax,但它总是将我的请求确定为不是 Ajax:https://stackoverflow.com/a/28540611/6804700

【问题讨论】:

  • 是什么让您认为res.send(data) 正在发送 JSON?您的客户需要 JSON JSON.parse(data) - 如果您不发送 JSON,您将在此处收到错误...和 ​​req.headers.accept.indexOf('json') ... 请求标头是否包含带有确切 4 个字符的接受 json
  • @JaromandaX 抱歉,我对使用 Ajax 和 JSON 很陌生。
  • 好吧...检查浏览器开发者工具控制台。您应该能够准确地看到请求和响应的样子,包括标头 - 提示:Accept 可能是 */*
  • 如果您想避免将内容提供给普通浏览器 URL,我建议您使用自己的自定义标头。
  • @JaromandaX 它说它来自主页(这是真的),但 Ajax 请求正在发送到/data_annotations

标签: javascript node.js ajax express


【解决方案1】:

第一件事 - 在您的客户端代码中,您需要设置接受标头,因为这是您在服务器端代码中寻找的内容。

xhr.setRequestHeader("accept", "application/json");

其次,您可以使用以下代码在服务器端代码中以 json 格式返回数据

res.json(data);

另一个评论。在 API 中更改结果类型或重定向是不好的做法。您的 url 要么返回 JSON,要么重定向到 HTML 页面,这意味着结果不一致。

【讨论】:

  • 我不习惯 Express JS 语法。我正在尝试像使用 MVC 一样使用它(我听说是这样的)。
  • 一旦你了解了非阻塞 I/O 和回调,它与 MVC 相同。只是需要一些时间来适应。您将一直使用的库是异步库 - npmjs.com/package/async。它将使您的代码更简单,更具可读性
  • @RedJandal - 使用 Promise 进行编程并将它们用于异步流控制和协调比使用异步库进行简单的回调要好得多。 Promises 和 async/await 是 Javascript 中几乎所有异步开发的未来。哎呀,node.js v10 甚至有一个承诺版本的fs 库。
  • 我去看看。
  • @jfriend00 - 我完全同意。我只是根据用户的示例和当前的经验提出建议,并没有在此阶段增加更多复杂性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-11
  • 2013-02-19
  • 2021-11-16
  • 1970-01-01
  • 1970-01-01
  • 2015-04-05
  • 2016-09-19
相关资源
最近更新 更多