我继承了连接到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语句的结果,我看到两个结果:&#34; post-results = [object Object]&#34;和&#34;在后期结果=&#34;。
我明显做错了什么,但我不明白什么。我已经尝试了许多其他不同的方法,所有方法都具有同样令人不满意的结果。对于它的价值,&#34; get&#34;这个类的脚本运行得很好。我想知道是否有人可以帮助我做到这一点&#34; post&#34;脚本吧。
答案 0 :(得分:0)
正如您在日志中所述,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);
}
}
});
};