Мои ошибки при обновлении POST не отображаются в клиентском JavaScript - PullRequest
0 голосов
/ 11 мая 2018

Я пытаюсь реализовать вызов POST REST в node.js, используя restify. В этом случае я хочу отправить ошибку в браузер. К сожалению, я не выяснил, как отправить данные об ошибках, чтобы JavaScript в браузере мог видеть данные об ошибках, которые я отправил.

Когда я вызываю функцию doPost () в браузере, он выполняет ajax POST-вызов на мой сервер. Код сервера возвращается с ошибкой 400 и небольшим объектом JSON, содержащим сообщение об ошибке.

Затем браузер переходит к функции .fail (). Однако textStatus имеет значение «error», errorThrown представляет собой пустую строку, а свойства jqXHR представляют собой readyState: 0, responseText: «», status: 0, statusText: «error».

Что я могу сделать, чтобы получить данные об ошибках от узла к клиентскому браузеру?

Вот код jQuery, который запускается в браузере:

function doPost() {

$.ajax({
    url: "http://localhost:3979/api/address",

    type: "POST",

    // Request body.
    data: {key: "mykey", address: "myaddress"}
})

.done(function(data) {
    // Show the formatted JSON in the text area.
    $("#outputTextArea").val(JSON.stringify(data, null, 2));
})

.fail(function(jqXHR, textStatus, errorThrown) {
    // An error occurred. Display the error information.
    $("#outputTextArea").val(
        "status: " + jqXHR.status +
        ", textStatus: " + textStatus + 
        ", errorThrown" + errorThrown + "\r\n");
});

}

А вот код Node.js, который работает на сервере:

const restify = require('restify');

// Create the server.
let server = restify.createServer();
server.listen(process.env.port || process.env.PORT || 3979, function () {
    console.log(`${server.name} listening to ${server.url}`);
});

// POST call that returns an error.
server.post("/api/address", async (req, res) => {
    res.send(400, {errorMessage: "The value given does not appear to be valid."});
});

Редактировать: оба res.status(422); res.send("The value given does not appear to be valid."); и res.send(new BadRequestError('meh')); терпят неудачу точно так же. Свойства jqXHR одинаковы (ноль для readyState и status, пустая строка для responseText), textStatus - это «error», а errorThrown - пустая строка.

Я проверил свой код .ajax на известный рабочий вызов POST, и он получил правильные значения, включая JSON responseText.

Может кто-нибудь, пожалуйста, попробуйте это в node.js и покажите мне, что я делаю неправильно, или покажите мне правильный способ отправить ошибку в браузер. Пока ничего не работает.

Редактировать: После дальнейших тестов и экспериментов, на этот раз с curl, я обнаружил, что мой вызов POST работает и возвращает ожидаемые значения.

Я использовал эту команду curl для получения кода состояния:

curl -s -o /dev/null -w "%{http_code}" -X POST http://localhost:3979/api/address

И получил этот ответ: 400

Затем я использовал эту команду curl:

curl -X POST http://localhost:3979/api/address

И получил этот ответ:

{"errorMessage":"The value given does not appear to be valid."}

Похоже, проблема существует на стороне браузера.

Этот вопрос о переполнении стека , похоже, указывает на проблему между доменами (страница: www.mydomain.com/register, REST: server.mydomain.com/rest). Тем не менее, я делаю все это с помощью localhost, поэтому я не вижу, как браузер может увидеть междоменную проблему здесь.

Есть какие-нибудь идеи, как получить ошибки REST POST, которые будут отображаться в браузере при работе на localhost?

...