我有一个http post请求,但是当我调用api时会被触发两次。
基本上我知道节点是异步的,所以可能正在等待运行sql来获取数据,但不知道如何绕过它。我的代码如下:
$http({ method: 'POST',
url: '/api/updateBooking',
data: JSON.stringify({'booking' : selectedItem }),
headers: {'Content-Type': 'application/json'}
}).success(function (data, status, headers, config) {
if (data == "true")
{
$scope.updateSuccess = true;
}
}).
error(function (data, status, headers, config) {
//hits this when unauthorized.
$scope.invalid = true;
});
因此,只要上面的代码运行,它将直接成功,然后是错误但没有返回数据。但是在它通过数据之后立即。
我的服务器代码在下面被称为
一
pp.post('/api/updateBooking', function(req,res)
{
var booking = req.body.booking;
var success = "false";
console.log("req.booking=", booking.Date1);
// just update the booking regardless as the booking is selected and is valid.
console.log(booking);
var bookingSql = 'SELECT * FROM Booking WHERE ' + booking.BookingID + '= ID ';
connection.query(bookingSql, function(err,result){
console.log(err);
if(err) {success= false;}
console.log('here result=', result);
//if record found then ok to proceed
if (result != null)
{
var updateBookingSQL = 'UPDATE Booking SET ? WHERE ID = ? ';
var bookingFields = { Date1: booking.Date1,
Date1AMPM: booking.Date1AMPM,
Date2: moment(booking.date2).format('YYYY-MM-DD'),
Date2AMPM: booking.Date2AMPM,
}
console.log('booking fields', bookingFields);
//go and do the update using the bookingID
connection.query(updateBookingSQL, [bookingFields, booking.BookingID], function(err,result)
{
console.log(err);
if (err) {success="false";}
if (result != null)
{
console.log('update booking result', result);
if (result.changedRows == 1)
{
console.log('changed row', result.changedRows);
success = "true";
}
}
res.send(success);
console.log('result of update====', success);
});
}
});
console.log('success=', success) ;
});
任何想法都会很棒
答案 0 :(得分:1)
我看到以下几个问题:
您不应该将用户输入的值连接到您的SQL查询中(特别是此处为bookingSql
),您可以通过这种方式对SQL注入攻击进行打开。
发生错误时(特别是在第一次查询后),您没有响应POST请求。
答案 1 :(得分:0)
您正在将成功的含义从布尔混合到字符串。您将其初始化为"false"
,然后在出错时将其设置为false
此外,您的代码中有许多控制路径,最终不会从客户端向POST发送响应。当你确定你已经完成了回送东西时,做一个response.end()通常是个好习惯。