【问题标题】:Accessing the variable outside the function访问函数外的变量
【发布时间】:2019-09-15 15:34:29
【问题描述】:

我正在使用 Node.js 在 lambda 中为 Amazon Alexa 开发一项技能。

我已经全局声明了变量,并在函数中初始化并在函数外部访问它。但我收到未定义的错误。请帮忙。


var res;
async function classSection(handlerInput){


  standard = handlerInput.requestEnvelope.request.intent.slots.Class.value;
  section = handlerInput.requestEnvelope.request.intent.slots.Section.value;

  var speechOutput = `Starting attendance for class ${standard}, section ${section}. <break time = "3s"/> 
  I will call the Names of the students, please say Present or Absent to Mark the attendance. <break time = "1s"/> Lets Start.  `;

    //getting the list of students from database
    con.connect(function(err){
        if(!err) {
            console.log("Database is connected");    
        } else {
            console.log("Error connecting database");    
        }
    });

    const sql = `SELECT StudentDetailID,StudentName FROM attendance_system.student_detail where student_detail.Class = ${standard} 
    and student_detail.Section = '${section}';`;

    console.log(sql);
     con.query(sql, function (err, result, fields) {
        con.end();

        if (!err){
            console.log(result);
            console.log("Table Data : "+result[1].StudentName);

            res = result[1].StudentName;
            console.log("Speech : "+ speechOutput + res);
            //Here in res I get the name of the student.   

        }
        else
    console.log('Error while performing Query.');
        });

    console.log(res);
//here I get undefined error.
 return handlerInput.responseBuilder
            .speak(speechOutput + res)
            .reprompt()
            .withSimpleCard('Attendance System',`Class : ${standard} \n Section : ${section}`)
            .getResponse();
}

【问题讨论】:

标签: node.js aws-lambda alexa-skills-kit alexa-app


【解决方案1】:

我经常在这个论坛上寻找与类似问题相关的问题。要么关于 Async-Await 的文档不够充分,要么对 Async-Await 与回调函数的使用存在一些误解。

你的情况有两个问题。

  1. con.query 是异步函数。所以,当你的回调函数被调用时,'console.log(res);'将已经执行,因此 res 变量中没有定义任何内容。

  2. 您不能将回调与 Aysnc-Await 语法一起使用。您必须承诺您的回调并在 Async 函数中使用它才能获得预期的结果。

    Here is the example for it

【讨论】:

    【解决方案2】:

    也许一个可能的解决方案是使用 promisify 方法,因为这个执行是异步的

    const promisify = require('util').promisify
    
    async function classSection(handlerInput){
    
        try {
            standard = handlerInput.requestEnvelope.request.intent.slots.Class.value;
            section = handlerInput.requestEnvelope.request.intent.slots.Section.value;
    
            var speechOutput = `Starting attendance for class ${standard}, section ${section}. <break time = "3s"/>
            I will call the Names of the students, please say Present or Absent to Mark the attendance. <break time = "1s"/> Lets Start.  `;
    
            //getting the list of students from database
            await promisify(con.connect)();
    
            const sql = `SELECT StudentDetailID,StudentName FROM attendance_system.student_detail where student_detail.Class = ${standard}
            and student_detail.Section = '${section}';`;
    
            console.log(sql);
    
            const result = await promisify(con.query)(sql)
    
            console.log(result);
            console.log("Table Data : "+result[1].StudentName);
    
            const res = result[1].StudentName;
            console.log("Speech : "+ speechOutput + res);
            //Here in res I get the name of the student.
    
            console.log(res);
    
            //here I get undefined error.
            return handlerInput.responseBuilder
                        .speak(speechOutput + res)
                        .reprompt()
                        .withSimpleCard('Attendance System',`Class : ${standard} \n Section : ${section}`)
                        .getResponse();
        } catch (err) {
            console.log('Some Error was throwed', err);
            throw err;
        } finally {
            if (con.isConnect()) con.end() // i dont know if isConnect exists
        }
    }
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-25
      • 2014-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-26
      相关资源
      最近更新 更多