【问题标题】:Azure Mobile Service: 500 Error but it's actually working?Azure 移动服务:500 错误,但它确实有效?
【发布时间】:2016-03-09 21:21:32
【问题描述】:

我有一个带有自定义 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 消息显示了预期值。

唯一奇怪的是调用返回“500:内部服务器错误”错误。

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

那么,什么给了?

【问题讨论】:

    标签: azure-mobile-services


    【解决方案1】:

    mssql.query 可以根据存储过程中的内容多次调用您的回调。您可以在回调之外定义一个变量,例如

    var callbackReceived = false;
    

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

    if (callbackReceived === false && results && results.length > 0) {
    
      callbackReceived = true;
      // continue as before
    }
    

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

    【讨论】:

    • 因此,您引用的问题/答案实际上与我的问题的答案有关,但您给出的答案不是我从与我交谈的 Microsoft 技术支持人员那里听到的任何内容。虽然 SSMS 没有显示返回多个查询集,但添加 SET NOCOUNT ON 是我的问题的解决方案。我从未听说过mssql.query 不止一次调用回调,也从未经历过。如果这是真的(我不相信是这样),那就是 Azure 的一个主要设计缺陷。
    • 我同意,这也不是我期望 mssql.query 工作的方式。我终于在同一个 Azure 开发人员那里找到了这个 MSDN 线程:social.msdn.microsoft.com/Forums/azure/en-US/… 鉴于我在 Microsoft 技术支持方面的经验,我不希望他们能够回答这个问题。
    • mssql 模块(参考:npmjs.com/package/node-mssql)是 Node 应用程序与 SQL Server 交互的方式 - 这与 Azure 无关。
    • 使用的正确npm包是npmjs.com/package/node-sqlserver
    猜你喜欢
    • 2013-03-27
    • 1970-01-01
    • 2016-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多