我正在尝试创建一个专用于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
答案 0 :(得分:2)
第一件事-在客户端代码中,您需要设置accept标头,因为这是您在服务器端代码中所寻找的。 p>
xhr.setRequestHeader("accept", "application/json");
第二,您可以使用以下代码在服务器端代码中将数据作为json返回
res.json(data);
另一条评论。不好的做法是更改结果类型或在API中重定向。您的网址返回的是JSON或重定向到HTML页面,这意味着结果不一致。