【问题标题】:Need to keep promise result in a variable for Nodejs mssql validation需要在 Nodejs mssql 验证的变量中保持承诺结果
【发布时间】:2017-11-25 18:25:42
【问题描述】:
    let RetrieveFromDb=(queryStr) =>
{
    let sql=require('mssql');
    let config={
        server:'127.0.0.1',
        database:'TestDB',
        user:'user',
        password:'user',
    };
    let dbConn=new sql.Connection(config);
    return dbConn.connect().then(function (){
        let request=new sql.Request(dbConn);
        return request.query(queryStr)
        .then(function(recordset)
        {
            return recordset;
            dbConn.close();

        }).catch(function (err) {
            console.log(err);
            dbConn.close();
        });
    }).catch(function (err)  {
        console.log(err);
    });
};


RetrieveFromDb("Select FirstName from User where UserID='1'").then(function(x){console.log(x[0].FirstName);});//console is displying the FirstName value from DB
RetrieveFromDb("Select FirstName from User where UserID='1'").then(res=>{console.log(res[0].FirstName)});//console is displying the FirstName value from DB

以上两个函数调用返回值到控制台,但我想将 RetrieveFromDb() 的结果保存到一个变量中,以便与其他数据进行比较以进行验证。

假设如果 var actualFirstname=RetrieveFromDb(myquery); 那么我将比较 if(actualFirstname===expectedFirstName) 与否。

【问题讨论】:

  • return: "当在函数中调用return 语句时,该函数的执行将停止。"
  • 感谢您的评论,您能否建议我如何改进代码,避免退货,以实现从数据库获取数据的目标。我添加了返回,因为没有添加返回它返回“未定义”。请帮忙
  • 您必须将dbConn.close(); 移动到return recordset; 之前/上方,否则您不会关闭数据库连接

标签: javascript node.js promise node-mssql


【解决方案1】:

Promises 是一种代码同步方法,因此您必须将它们的操作视为异步的,并使用您在 Promise 解决时获得的值。没办法:

var actualFirstName = RetrieveFromDb(myquery);
actualFirstName === expectedFirstName;

相反,您必须在承诺解决时进行比较:

RetrieveFromDb(myquery).then(data => {
  data.actualFirstName === expectedFirstName;
});

【讨论】:

    【解决方案2】:

    谢谢大家,这几天我一直在兜圈子,试图弄清楚代码的异步性质。对我来说,灯泡时刻是你必须将变量值设置为回调/承诺堆栈的一部分(即在函数中分配它)我的背景是 Excel、VBA、Sequel Server、PHP oop、C#。在所有这些语言中,函数都是运行一段谨慎的代码并返回一个值,然后将其分配给等式左侧的对象。

    function myFunc(){ return 'Hello World'}
    
    var myvar =   myFunc() // sets myvar to 'Hello World'
    

    在 Node 的土地上,您必须执行分配 IN 功能

    function myFunc(){ myvar = 'Hello world'}
    

    所以要从数据库中获取数据:

    fetchFromDB('Select top 10 * from x',(err,res) =>{ myvar1 = res})
    fetchFromDB('Select top 10 * from Y',(err,res) =>{ myvar2 = res})
    

    【讨论】:

      猜你喜欢
      • 2020-05-10
      • 1970-01-01
      • 1970-01-01
      • 2020-02-12
      • 2019-08-30
      • 2018-08-30
      • 1970-01-01
      • 1970-01-01
      • 2019-09-18
      相关资源
      最近更新 更多