Я пытаюсь реализовать вызов 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?