Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Azure mobile services Azure移动服务:500错误,但它';他真的在工作吗?_Azure Mobile Services - Fatal编程技术网

Azure mobile services Azure移动服务:500错误,但它';他真的在工作吗?

Azure mobile services Azure移动服务:500错误,但它';他真的在工作吗?,azure-mobile-services,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.getT

我有一个带有自定义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);
                }
              });
            }
          }    
        });
      }
    }
  });
};
现在,
sendmail
是一个单独的功能,它使用Azure的SendGrid功能发送电子邮件

真正让我困惑的是,所有的代码似乎都工作得很好

  • 存储过程执行得很好
  • 数据库的更新完全符合我的预期
  • 电子邮件完全按照预期通过SendGrid服务发送
  • 代码中的console.log消息显示预期值
  • 唯一令人不安的是,该调用返回了一个“500:InternalServerError”错误

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

    那么,给出了什么呢?

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

    var callbackReceived = false;
    
    然后,在回调中,只为实际收到更新记录的调用发送响应:

    if (callbackReceived === false && results && results.length > 0) {
    
      callbackReceived = true;
      // continue as before
    }
    
    另请参见Azure开发人员之一回答的问题:

    因此,您提到的问题/答案实际上与我的问题的答案有关,但您给出的答案与我与之交谈的Microsoft技术支持人员的回答无关。尽管SSMS没有显示返回的多个查询集,但在
    上添加
    SET NOCOUNT是我问题的解决方案。我从未听说过
    mssql.query
    多次调用回调,也从未经历过。如果这是真的(我不相信是真的),那就是Azure的一个主要设计缺陷。我同意,这也不是我所期望的mssql.query的工作方式。我最终找到了这个与同一个Azure开发人员的MSDN线程:鉴于我在Microsoft技术支持方面的经验,我不希望他们能够回答这个问题。mssql模块(参考:)是节点应用程序与SQL Server交互的方式-这与Azure无关。使用的正确npm包是