Azure移动服务:500错误,但实际上有效吗?

时间:2016-03-09 21:21:32

标签: azure-mobile-services

我有一个带有自定义API的Azure移动服务。我以前从iOS测试过这个API,它似乎工作正常。我现在正在Android上测试此API。这是有问题的API方法:

exports.post = function(request, response) {
  var body   = request.body;
  var email  = body.email;
  var tables = request.service.tables;
  var users  = tables.getTable('User');
  users.where({ email: email }).read({
    success: function (userList) {
      if (userList.length === 0) {
        response.send(200, { Status: 'Error', Error: 'Email not found.' });
      } else {
        var user       = userList[0];
        var providerId = user.ObjectId;
        var accounts   = tables.getTable('Account');
        accounts.where({ User: providerId }).read({
          success: function (accountList) {
            if (accountList.length === 0) {
              response.send(200, { Status: 'Error', Error: 'Internal server error.' });
            } else {
              var account = accountList[0];
              var mssql   = request.service.mssql;
              var sql     = "EXEC [db].[usp_RequestPasswordReset] ?;";
              mssql.query(sql, [account.id], {
                success: function (results) {
                  console.log(results);
                  var codeRow = results[0];
                  if (codeRow == undefined) {
                    console.log("codeRow is undefined");
                  } else {
                    console.log(codeRow);
                  }
                  var code    = codeRow.Code;
                  response.send(200, { Status: 'Success', Message: 'Please check your email for further instructions.', Code: code });
                  sendEmail(email, user.Name, code);
                }
              });
            }
          }    
        });
      }
    }
  });
};

现在,sendEmail是一个单独的函数,它使用Azure的SendGrid功能发送电子邮件。

令我感到困惑的是,所有代码似乎都运行正常。

  1. 存储过程执行得很好。
  2. 数据库的更新完全符合我的预期。
  3. 电子邮件完全按预期通过SendGrid服务发送。
  4. 我在代码中显示的console.log消息显示了预期的值。
  5. 唯一的问题是该调用返回“500:内部服务器错误”错误。

    • 在我的Android客户端以及Azure管理门户上的API日志中都是如此。
    • 我收到的错误消息告诉我var code = codeRow.Code;正在尝试访问“未定义”的“代码”。但是未定义。
    • 回过头来检查我的iOS客户端会产生相同的结果。
    • 除了返回给用户的消息外,一切正常。
    • 要清楚,错误代码是500而不是200,因为我的代码可能会返回“内部服务器错误”消息。
    • 此外,我非常确定我的mssql.query成功阻止是根据控制台日志消息和结果触发的。

    那么,是什么给出了?

1 个答案:

答案 0 :(得分:1)

mssql.query可以多次调用您的回调,具体取决于您的存储过程中的内容。您可以在回调之外定义变量,例如

localhost:xxxx/myDB

然后在你的回调中,只发送实际收到更新记录的呼叫的响应:

var callbackReceived = false;

另请参阅Azure开发人员之一回答的问题: Azure mobile service custom API calling SQL SP multiple times