簡體   English   中英

AngularJS&Socket.IO-從服務(在此處發出)到控制器的返回值未定義|| 承諾,異步性

[英]AngularJS & Socket.IO - Return value from Service (emit here) to Controller is undefined || promises, asynchronicity

我沒有使我的代碼正常工作。

我正在使用AngularJS開發一個應用程序,其中包括通過socket.io與后端服務器的連接。 我正在使用登錄名,該登錄名旨在將用戶的數據發送到服務器。 如果發送的數據正確(電子郵件和密碼),則服務器將以“有效”和用戶數據(名稱,dateOfBirth等)進行響應。 元素是:

  • BackendService(執行發射到服務器的工廠)
  • AppController(調用BackendService登錄功能的控制器)
  • Node.js服務器(計算發送的數據是否有效,以便用戶可以登錄)

目的是使工廠中的登錄功能返回一個“登錄代碼”,該代碼告訴控制器登錄是否正確。 不幸的是,該函數返回“ undefined” 在研究過程中,我發現這可能是由於異步性和承諾。 但是,我無法將給定的信息應用於我的問題,因為大多數都是關於$ 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')
        }
    })
})

BackendService(工廠)

"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;
  }
};

角度控制器

$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查詢返回結果之前進行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM