javascript - AngularJS 和 Socket.IO - 从服务(此处发出)到 Controller 的返回值未定义 || promise 、异步

标签 javascript angularjs node.js sockets socket.io

我的代码无法正常工作。

我正在使用 AngularJS 开发一个应用程序,包括通过 socket.io 连接到后端服务器。我正在开发一个登录名,旨在将用户的数据发送到服务器。如果发送的数据正确(电子邮件和密码),服务器将响应“有效”和用户数据(姓名、出生日期等)。元素是:

  • BackendService(执行发送到服务器的工厂)
  • AppController(调用BackendService登录功能的 Controller )
  • Node.js 服务器(计算发送的数据是否有效,以便用户可以登录)

目的是工厂中的登录函数返回一个“登录代码”,告诉 Controller 登录是否正确。不幸的是,函数返回“未定义”。在我的研究过程中,我发现这可能是因为异步性和 promise 。但是,我无法将给定的信息应用于我的问题,因为大多数信息与 $http 有关。另外 - 如果我的代码结构需要改进,请告诉我!

这是我的代码:

Node.js 服务器

socket.on('logincust', function (p1, fn) {
    connection.query("SELECT Salt FROM Customer WHERE Email = ?", [p1.Email], function (err, data, fields)
        {
        if (err) { 
            throw err;
        }
        if (data.length > 0) {
            var hash = crypto.createHash('sha256').update(p1.Password + data[0].Salt).digest('base64');
            connection.query("SELECT LName,FName,Email,Telephone,Address,DateOfBirth  FROM Customer WHERE Password = ?", [hash], function (err, data2, fields) {
                if (err) {
                    throw err;
                }
                if (data2.length > 0) {
                    fn('valid', data2[0]);
                }
                else {
                    fn('invalidpassword', 'nodata')
                }
            })
        }
        else { 
            fn('invalidemail','nodata')
        }
    })
})

后端服务(工厂)

"use strict";

mobileClientApp.factory('BackendService', function() {

  var mySocket = io.connect('http://thisLinkIsPrivate:8888/ns');

  return {

  login: function (pUserData) {
  if (mySocket.connected) {
    mySocket.emit('logincust', pUserData, function (resp, data) {

      if (resp == "valid") {

        var parsedData = JSON.stringify(data);
        console.log(parsedData);

        user.lName = parsedData.LName; // Fill userData
        user.fName = parsedData.FName;
        user.email = parsedData.Email;
        user.phoneCallcenter = parsedData.Telephone;

        console.info("Login successful.");

        return 0;
      }
      else {
        if (resp == "invalidpassword") {
          return 1;
        }
        else if (resp == "invalidemail") {
          return 2;
        }
      }
    });
  }
  else { // Socket is not connected
    console.warn("Socket not connected.);
    user.fName = "Peter";
    user.lName = "Offline";
    return -1;
  }
};

Angular Controller

$scope.doLogin = function() { 

  var user = {'Email': this.loginData.username, 'Password': this.loginData.password};
  var isLoggedIn = BackendService.login(user); // 0 - logged in, 1 - invalid password, 2 - invalid email, -1 - socket not connected

  console.log("BackendService.login(user): " + BackendService.login(user)); // is undefined!

  console.log("isLoggedIn: " + isLoggedIn); // undefined!

  if (isLoggedIn == 0 || isLoggedIn == -1) {

      $location.path('/app/landing');
  }
  else {
      $scope.errorMessage = "Invalid login data!";
  }
};

最佳答案

是的,问题似乎是异步的。如果您想访问登录方法的结果,您应该向其传递回调。因为在您调用它之后,下一次执行将是您的控制台日志,并且这将在您的 SQL 查询返回结果之前发生。

关于javascript - AngularJS 和 Socket.IO - 从服务(此处发出)到 Controller 的返回值未定义 || promise 、异步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34513535/

相关文章:

javascript - 如何在 angular js 的 cookie 中存储登录 session ID?

php - 编写聊天应用程序

javascript - 用于团队/教育协作的 Node.js 白板应用程序

javascript - 嵌套ng-repeat导致浏览器卡顿如何处理

javascript - lodash:根据对象的子数组创建数组

javascript - AngularJS ui-router - 设置菜单处于事件状态

javascript - 如何使用 ngDisable 在 Angular 表达式中使用条件?

javascript - Qualtrics:使用 javascript 转换管道变量并将其显示在文本中?

javascript - 在 div jquery 中滚动到 div 的顶部

javascript - NodeJS 错误 EADDRINUSE 和 HTML 文件未呈现,而是显示 html 代码