Node.js无法识别Ajax请求

时间:2018-07-02 02:08:54

标签: javascript node.js ajax express

我正在尝试创建一个专用于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

1 个答案:

答案 0 :(得分:2)

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

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

第二,您可以使用以下代码在服务器端代码中将数据作为json返回

res.json(data);

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

相关问题