我继承了一个连接到Azure移动服务的iOS应用程序的开发,我一直坚持从插入操作中获得可接受的响应。具体来说,我想从这个项目的前一个开发人员创建的自定义API脚本中获取插入的对象,或者至少获取其id字段的值。
我使用的自定义API脚本的截断版本如下:
exports.post = function(request, response) {
var mssql = request.service.mssql;
var sql = "INSERT INTO Reservation (<field names>)" +
" VALUES (<field values>); "
+"SELECT id FROM Reservation WHERE __updatedAt = (SELECT MAX(__updatedAt) FROM Reservation);";
mssql.query(sql, {
success: function(results) {
console.log("after post - results = " + results);
response.send(statusCodes.OK, results);
}
});
};
当我运行iOS应用程序并发布预订(使用AFNetworking类与服务器通信)时,我会返回一个带有空数组的响应对象。此外,在检查Azure日志中console.log语句在我的函数中的结果时,我看到了两个结果:"after-post-results=[object object]"one_answers"after-post-results="。
我显然做错了什么,但我不明白是什么。我尝试了许多其他不同的方法,结果都同样令人不满意。就其价值而言,这个类的"get"脚本运行得很好。我想知道是否有人能帮我把这个"后"脚本做好。
正如您在日志中所指出的,mssql.query
调用的成功回调被调用了两次,因为您的查询中有两条语句。当您第一次调用response.send
时,这是发送回客户端的响应。第一个回调将包含INSERT
调用的结果,这不是您想要返回的结果。您应该使用一个标志来指示您正在接收的结果,并且只有当它是您想要的结果时才返回:
exports.post = function(request, response) {
var mssql = request.service.mssql;
var sql = "INSERT INTO Reservation (<field names>)" +
" VALUES (<field values>); "
+"SELECT id FROM Reservation WHERE __updatedAt = (SELECT MAX(__updatedAt) FROM Reservation);";
var firstCall = true;
mssql.query(sql, {
success: function(results) {
console.log("after post - results = " + results);
if (firstCall) {
firstCall = false;
} else {
response.send(statusCodes.OK, results);
}
}
});
};