2017-03-04 4 views
0

私の意図するコードの使用は、データベースにユーザUserの形式で関数に渡されるユーザ名とパスワードが設定されているかどうかをチェックすることです。ノードJSが "グローバル変数"を更新しない

私は成功変数をfalseに初期化します。そして、もし私がその記録を見つければ、私はそれを真にするでしょう。ただし、レコードが見つかった場合でも、success変数はまだfalseです。変数は更新されていないようです。どうして? また、レコードが見つかったかどうかを示すことができますが、fetcheduserの結果全体を返すにはどうしたらいいですか?多くのありがとう

LoginSuccess : function (User) { 

    var success = false; 
    function isEmptyObject(obj) { 
     return !Object.keys(obj).length; 
    } 

    function isEmptyObject(obj) { 
     for (var key in obj) { 
      if (Object.prototype.hasOwnProperty.call(obj, key)) { 
       return false; 
      } 
     } 
     return true; 
    } 
    var sql = require('mssql'); 
    var config = require('./configuration/sqlconfig'); 
    var fetcheduser; 
    sql.connect(config).then(function() { 
     console.log('Connected to DB'); 
     new sql.Request().query("SELECT * FROM dbo.LocalUser WHERE Username = '" + User.username + "' AND Password = '" + User.password + "';") 
      .then(function (recordset) { 
       if (isEmptyObject(recordset)) { 
        console.log("The User does not exist"); 
       } else { 
        fetcheduser = JSON.parse(JSON.stringify(recordset)); 
        success = true; 
        console.log("The user is existed."); 
       } 
      }).catch(function (err) { 
       //When errors come 
      }); 
    }); 
    return success; 
} 
+1

私にこれを聞かせてください:どちらが先に来ますか?成功を真にするか、結果を返しますか?ヒント:それはおそらくあなたが考えるものではありません。また、あなたのselectステートメントは注入攻撃のために熟しています - Bobby Tablesのことを考えてください... – Krease

+0

これは非同期です:成功に戻り、trueに設定されています。 – bugovicsb

+0

成功を返す前にそれを真に設定するにはどうすればよいですか? –

答えて

0

正確なsuccess状態を取得するにはPromiseを返す必要があります。そう...

function LoginSuccess() { 
    var success = false; 

    return sql.connect(config) 
    .then(() => { 
     return new sql.Request().query(...).then(
     () => success = true, 
     () => success = false 
    ); 
    }) 
    .then(() => { 
     return success; 
    }); 

} 

LoginSuccess().then(success => ...); 
0

実際には変数は更新されていますが、遅すぎます。 result = { success: false }をしようと復帰直後resultをチェックして、5秒後に(または任意の適切な)、そしてあなたはそれが変更されたことが表示されます。setTimeout(() => console.log(result), 5000)

とにかく、生産のために、約束の解決のために行きます。ノード7.6は最終的にasync/awaitになりましたので、醜い...thenの回避策を取り除くことができます。

関連する問題