【问题标题】:Boolean not set to true node.js布尔值未设置为 true node.js
【发布时间】:2019-02-04 18:12:30
【问题描述】:

我有这个代码: 在文件的开头我初始化了变量(var loginState = false;) 为什么console.log给我false,虽然我改成true

try {
        const client = new SimpleGraphClient(tokenResponse.token);
        const me = await client.getMe();

            sql.connect(config, async function (err){
                if (err) console.log(err);
                var request = new sql.Request();
                request.query(`SELECT * FROM tradebot.accounts WHERE username='${username}' AND password='${password}'`, async function (err, recordset){
                    if (err) console.log(err);
                    console.log(recordset);
                    if (recordset.recordset.length == 1) {
                        loginState = true;
                    } else {
                        loginState = false;
                    }
                    sql.close();
                });
            });
            console.log(loginState);
            if (loginState == true) {
                await turnContext.sendActivity({
                    text: 'Work',
                    attachments: [CardFactory.adaptiveCard(mainmenu)]
                });
            } else {
                await turnContext.sendActivity({
                    text: 'Dont work',
                    attachments: [CardFactory.adaptiveCard(internal_login)]
                });
            }            
    } catch (error) {
        throw error;
    }

【问题讨论】:

标签: node.js botframework


【解决方案1】:

输入console.log() inside sql.connect()`,它的工作方式是你所期望的。

sql.connect() 是一个异步方法,所以当console.log() 发生时,sql.connect() 还没有改变变量值。

loginState = false; // Statement 1

sql.connect(config, async function (err) { // Statement 2
    loginState = true;
})

console.log(loginState); // Statement 3

上面的执行顺序是,

声明 1

声明 3

声明 2

这就是它发生的原因。


如下更改代码以使其正常工作。

try {
  const client = new SimpleGraphClient(tokenResponse.token);
  const me = await client.getMe();

  sql.connect(config, async function (err) {
    if (err) console.log(err);
    var request = new sql.Request();
    request.query(`SELECT * FROM tradebot.accounts WHERE username='${username}' AND password='${password}'`, async function (err, recordset) {
      if (err) console.log(err);
      console.log(recordset);
      if (recordset.recordset.length == 1) {
        await turnContext.sendActivity({
          text: 'Work',
          attachments: [CardFactory.adaptiveCard(mainmenu)]
        });
      } else {
        await turnContext.sendActivity({
          text: 'Dont work',
          attachments: [CardFactory.adaptiveCard(internal_login)]
        });
      }
      sql.close();
    });
  });
} catch (error) {
  throw error;
}

希望这会有所帮助!

【讨论】:

  • 投反对票的人,你能解释一下答案有什么问题吗?
【解决方案2】:

原因是因为您在回调函数中将值设置为变量: 您必须等待查询结果。您调用查询的方式不可行。


看看-https://www.npmjs.com/package/mysql2

也改变这部分 -

sql.connect(config, async function (err){
   if (err) console.log(err);
    var request = new sql.Request();
    request.query(`SELECT * FROM tradebot.accounts WHERE username='${username}' AND password='${password}'`, async function (err, recordset){
     if (err) console.log(err);
     console.log(recordset);
      if (recordset.recordset.length == 1) {
        loginState = true;
      } else {
        loginState = false;
      }
     sql.close();
    });
 });

把它改成这样:

 try{
     let connection = await sql.connect(config);
     let query1 = await connection.query(`SELECT * FROM tradebot.accounts WHERE username='${username}' AND password='${password}'`);

      if (query1[0].recordset.length == 1) {
           loginState = true;
       } else {
           loginState = false;
       }
 }catch (err){
    // do something here
 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-27
    • 2012-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-23
    • 2015-09-19
    • 1970-01-01
    相关资源
    最近更新 更多