我正在尝试使用restify在node.js中实现POST REST调用。在这种情况下,我想向浏览器发送错误。不幸的是,我还没弄清楚如何发送错误数据,以便浏览器JavaScript可以看到我发送的错误数据。
当我在浏览器上调用doPost()函数时,它会对我的服务器执行ajax POST调用。服务器代码返回错误400和包含错误消息的小JSON对象。
然后浏览器转到.fail()函数。但是,textStatus为“error”,errorThrown为空字符串,jqXHR属性为readyState:0,responseText:“”,status:0,statusText:“error”。
如何将我的错误数据从Node传输到客户端浏览器?
以下是在浏览器中运行的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为空字符串。
我针对已知的工作POST调用测试了我的.ajax代码,它获得了正确的值,包括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."}
所以看起来浏览器端存在问题。
This stackoverflow question似乎表明存在跨域问题(页面:www.mydomain.com/register,REST:server.mydomain.com/rest)。但是,我使用localhost执行所有这些操作,因此我看不到浏览器如何在此处看到跨域问题。
有关在localhost上运行时如何让REST POST错误显示在浏览器中的任何想法?