我正在使用Express和Node。我有一些代码将JSON发布到另一个将其添加到数据库中的服务。
逻辑正在做他们应该做的事情,但我正在做的ajax电话永远不会回归,在网络' Chrome开发工具中的标签始终显示为'待定'最终错误出现在 net :: ERR_EMPTY_RESPONSE 。
谁能告诉我哪里出错了?
Ajax Call
$.ajax
({
type: "POST",
url: "/order",
contentType: 'application/json',
data: orderDataJson,
success: function () {
alert("success!");
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert("Something went wrong checking out!\n" + textStatus + "\n" + errorThrown);
}
});
以上路由到/ order,然后将数据发布到其他服务:
app.post("/order", function(req, res, next)
{
var options = {
uri: endpoints.ordersUrl + "order",
method: 'POST',
json: true,
body: req.body
};
request(options, function(error, response, body) {
if (error !== null )
{
return;
}
if (response.statusCode == 200 && body != null && body != "")
{
if (body.error)
{
res.status(500);
res.end();
return;
}
res.end(); // UPDATED AFTER COMMENT
return;
}
console.log(response.statusCode);
});
});
这是其他服务中的相关代码(它正确地在数据库中添加内容)
if (request.method == 'POST')
{
switch (path)
{
// Add a new order
case "/order":
var body = '';
request.on('data', function (data) {
body += data;
});
request.on('end', function () {
var orderData = JSON.parse(body);
// Insert into orders table
var saleDate = getDate();
var ordersQuery = "INSERT into orders (customerId, saledate)" +
" VALUES (" + orderData.customerId +",'" + saleDate + "')";
db.query(ordersQuery, function(err, result)
{
if (err)
{
throw err;
}
var orderId = result.insertId;
// Insert order details
for (var i=0; i < orderData.order.length; i++)
{
var productId = orderData.order[i].productId;
var quantity = orderData.order[i].quantity;
var orderDetailsQuery = "INSERT into orderdetails (orderID, productID, quantity)" +
"VALUES (" + orderId + "," + productId + "," + quantity +")";
db.query(orderDetailsQuery, function(err, result)
{
if (err)
{
throw err;
}
});
}
});
response.writeHead(200, {
'Access-Control-Allow-Origin': '*'
});
});
break;
答案 0 :(得分:0)
尝试在错误块中添加:
if (error !== null ) {
res.status(500).send('Internal server error!');
return;
}
答案 1 :(得分:0)
我解决了这个问题。问题似乎是明确的“中间件”功能应该是:
app.post("/order", function(req, res, next)
而不是:
{{1}}
来自expressjs docs:
如果当前的中间件函数没有结束请求 - 响应周期,则必须调用next()将控制权传递给下一个中间件函数。否则,请求将被挂起。