2016-02-03 4 views
3

Я новичок в node.js и javascript и пытаюсь узнать все. в моих тестах мне нужно выбрать значение из базы данных Oracle через выбор запроса и позже использовать его для моего кода. Я ссылаюсь на тот же код, что и на https://blogs.oracle.com/opal/entry/introducing_node_oracledb_a_node, и он работает нормально, но я не могу вернуть значение результата.Запрос DB возвращает неопределенное значение в node.js с oracledb

ниже мой код:

this.getTableData = function(){ 
     var res; 
     oracledb.getConnection(
       { 
        user : "user", 
        password  : "password", 
        connectString : "db " 
       }, 
       function (err, connection) { 
        if (err) { 
           console.error(err); 
           console.log("errorrrrrrrrrrr : "+err); 
           return; 
           }    
        connection.execute("SELECT query", 
         function(err, result) { 
            if (err) { 
             console.error(err); 
              return; 
             } 
            else if(result) { 
             res = result.rows[0][0]; 
             console.log("result in else if: "+res); 
             return res; 
            }}); 
        }); 
    }; 

функция возвращает неопределенное значение.

+0

Каков фактический запрос? Каково значение 'result', в отличие от' result.rows [0] [0] '? Какова ценность 'result.rows'? –

+0

Запрос: «SELECT OTPCODE FROM (SELECT OTPCODE FROM ONETIMEPASSWORD WHERE MSISDN = 91123456789 Order BY GENERATED_ON DESC) WHERE ROWNUM = 1", а result.rows & result.rows [0] [0] возвращает как шестизначное значение из таблицы типа 123456 –

ответ

4

Конечно, он возвращает undefined. Это из-за асинхронных функций обратного вызова. Вам нужно сделать что-то вроде этого:

this.getTableData = function(callback){ 
    oracledb.getConnection(
     { 
      user : "user", 
      password  : "password", 
      connectString : "db " 
     }, 
     function (err, connection) { 
      if (err) { 
       console.error(err); 
       console.log("errorrrrrrrrrrr : "+err); 
       return; 
      } 
      connection.execute("SELECT query", 
       function(err, result) { 
        if (err) { 
         console.error(err); 
         return; 
        } 
        else if(result) { 
         var res = result.rows[0][0]; 
         console.log("result in else if: "+res); 
         callback(res); 
        }}); 
     }); 
}; 

getTableData(function (result) { 
    console.log(result); 
}); 

Другой способ, которым Вы могли бы решить эту проблему с помощью Promise:

this.getTableData = function() { 
    return new Promise(function (resolve, reject) { 
     oracledb.getConnection(
      { 
       user: "user", 
       password: "password", 
       connectString: "db " 
      }, 
      function (err, connection) { 
       if (err) { 
        console.error(err); 
        reject(err); 
        console.log("errorrrrrrrrrrr : " + err); 
        return; 
       } 
       connection.execute("SELECT query", 
        function (err, result) { 
         if (err) { 
          console.error(err); 
          reject(err); 
          return; 
         } 
         else if (result) { 
          var res = result.rows[0][0]; 
          console.log("result in else if: " + res); 
          resolve(res); 
         } 
        }); 
      }); 
    }); 

}; 

getTableData() 
    .then(function (result) { 
     console.log(result); 
    }); 

код вы просили в своем комментарии:

var AddPage = function() { 
    var self = this; 
    this.enterOtpInput = element(by.model("beneDetail.otp")); 
    this.enterMpinInput = element(by.model("retailerMpin")); 
    this.verifyBeneficiaryButton = element(by.xpath("//div[2]/div/button")); 
    this.verifyBene = function() { 
     support.getTableData() 
      .then(function (result) { 
       console.log("adam: " + result); 
       self.enterOtpInput.sendKeys(result); 
       self.enterMpinInput.sendKeys("1111"); 
       self.verifyBeneficiaryButton.click(); 
      }); 

    }; 
} 
+0

Большое вам спасибо :) приведенный выше код работает. но у меня есть еще одно требование, поскольку мне нужно ввести значение результата в текстовое поле на веб-странице: this.element (by.model («otp»)). sendKeys (result); –

+0

- это любой способ, которым я могу установить значение результата для некоторой глобальной переменной и использовать его в sendKeys() как значение параметра. Я использую структуру Protractor + Jasmine. Благодарим за помощь заранее. –

+0

Я обновил свой ответ. – Adam

Смежные вопросы