Node.js не распознает Ajax-запрос - PullRequest
0 голосов
/ 02 июля 2018

Я пытаюсь создать личную страницу, посвященную запросу 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 голосов
/ 02 июля 2018

Первое - в вашем клиентском коде вам нужно установить заголовок accept, потому что это то, что вы ищете в своем коде на стороне сервера.

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

Во-вторых, вы можете использовать следующий код, чтобы вернуть данные как json в коде на стороне сервера

res.json(data);

Еще один комментарий. Это плохая практика, чтобы изменить тип результата или перенаправить в API. Ваш URL либо возвращает JSON, либо перенаправляет на страницу HTML, что означает, что результат не соответствует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...