【问题标题】:Node.js - Returning data from multiple MSSQL queriesNode.js - 从多个 MSSQL 查询返回数据
【发布时间】:2019-06-11 02:52:52
【问题描述】:

我是学习 Node.js 的新手,所以我仍然习惯于异步编程、回调和 Promise。我试图从一个记录集中的多个 MSSQL 查询返回数据,但我发现的大多数帮助文章都是关于 MySQL 的。

我尝试按照此处接受的答案中显示的步骤操作:Synchronous database queries with Node.js

在我的 SQL 函数中,当我打印到控制台时,它会正确显示对象。当我将它返回到我的快速路由器并尝试打印它说它是未定义的值时。

这是我的 MSSQL 函数:

var config = require('../../db/config');

async function getJobData(jobID) {

   const sql = require('mssql');
   let sqlResult = {};

   var lock = 2;

   var finishRequest = function() {
       // This prints the values properly
       console.log(sqlResult['jobData']['recordset']);
       console.log(sqlResult['jobText']['recordset']);

       return sqlResult;
   }

   // first query
   try {
        await sql.connect(config)
        let result = await sql.query(`SELECT * FROM Jobs WHERE JobID = ${jobID}`);

        lock -= 1;
        sqlResult['jobData'] = result;
        sql.close();
        if (lock === 0) {
            finishRequest();
        }
    } catch (err) {
        // ... error checks
        console.log(err);
    }

   // second query
   try {
        await sql.connect(config)
        let result = await sql.query(`SELECT * FROM JDSectionTxt WHERE JobID = ${jobID} ORDER BY TypeID, OrderID`);

        lock -= 1;
        sqlResult['jobText'] = result;
        sql.close();
        if (lock === 0) {
            finishRequest();
        }
    } catch (err) {
        // ... error checks
        console.log(err);
    }
}

module.exports = getJobData;

这是我的快速路由器:

const express = require('express');
//....
const app = express();
//....

// Job Descriptions - Edit
app.get('/jds/edit', (req, res) => {
    const getJobData = require("../models/jds/getJobData");

    let jobID = 0;

    if(req.query.jobID){
        jobID = parseInt(req.query.jobID);
    }

    let jobData = getJobData(jobID);

    jobData.then(result => {
        //This just prints 'undefined'
        console.log(result);

        res.render('jds/edit', {

            data: result
        });
    }).catch(err => {
        console.log(err);
    });

})

我需要在此处进行哪些更改才能正确地从我的 SQL 查询中传递对象,以便结果不是未定义的?

【问题讨论】:

    标签: javascript node.js


    【解决方案1】:

    我认为你把事情复杂化了。这里的代码应该可以满足你的需要:

    var config = require('../../db/config');
    const sql = require('mssql');
    
    async function getJobData(jobID) {
        let sqlResult = {};
    
        await sql.connect(config)
    
        let firstAwait = getFirstQuery(jobID);
        let secondAwait = getSecondQuery(jobID);
    
        sqlResult['jobData'] = await firstAwait;
        sqlResult['jobText'] = await secondAwait;
    
        return sqlResult;
    }
    
    async function getFirstQuery(jobID) {
        try {
    
            return await sql.query(`SELECT * FROM Jobs WHERE JobID = ${jobID}`);
        } catch (err) {
            // ... error checks
            console.log(err);
        }
    }
    
    async function getSecondQuery(jobID) {
        try {
            return await sql.query(`SELECT * FROM JDSectionTxt WHERE JobID = ${jobID} ORDER BY TypeID, OrderID`);
        } catch (err) {
            // ... error checks
            console.log(err);
        }
    }
    
    module.exports = getJobData;
    

    【讨论】:

    • 我肯定把它复杂化了。这正是我所需要的,它现在正在工作。我会阅读等待,谢谢!
    【解决方案2】:

    我认为您错过了退货声明。在第一个和第二个查询 try/catch 块中,您应该提供 return finishRequest()

    【讨论】:

      【解决方案3】:

      您还没有将结果返回给函数,所以它以未定义的形式发送它, 您可以像更新语句一样,查看代码中更新了什么,请在评论中找到 // 这是更新后的语句

      var config = require('../../db/config');
      function getJobData(jobID) {
      sql = require('mssql');
      sqlResult = {};
      lock = 2;
      var finishRequest = function() {
         // This prints the values properly
         console.log(sqlResult['jobData']['recordset']);
         console.log(sqlResult['jobText']['recordset']);
      
         return sqlResult;
      }
      try {
      await sql.connect(config)
      let result = await sql.query(`SELECT * FROM Jobs WHERE JobID = ${jobID}`);
      
          lock -= 1;
          sqlResult['jobData'] = result;
          sql.close();
          if (lock === 0) {
              finishRequest();
          }
      } catch (err) {
          // ... error checks
          console.log(err);
      }
      // second query
      try {
          await sql.connect(config)
          let result = await sql.query(`SELECT * FROM JDSectionTxt WHERE JobID = ${jobID} ORDER BY TypeID, OrderID`);
      
          lock -= 1;
          sqlResult['jobText'] = result;
          sql.close();
          if (lock === 0) {
              finishRequest();
          }
      } catch (err) {
          // ... error checks
          console.log(err);
      }
      // this is updated statement
      return sqlResult;
      }
      module.exports = getJobData;
      

      【讨论】:

      • 当他在 try catch 块中调用 finishRequest 时,finishRequest 然后返回带有结果的对象......我说的对吗?
      • finishRequest 在它被调用的地方返回结果,而不是主调用函数。
      【解决方案4】:

      虽然我对 async/await 不是很熟悉,但我相信下面的代码应该可以工作。

      var config = require('../../db/config');
      
      async function getJobData(jobID) {
      
          const sql = require('mssql');
          let sqlResult = {};
      
          try {
      
              await sql.connect(config)
              sqlResult['jobData'] = await sql.query(`SELECT * FROM Jobs WHERE JobID = ${jobID}`);
      
          } catch (err) {}
      
          try {
      
              sqlResult['jobText'] = await sql.query(`SELECT * FROM JDSectionTxt WHERE JobID = ${jobID} ORDER BY TypeID, OrderID`);
              sql.close();
      
          } catch (err) {}
      
          return sqlResult;
      }
      
      module.exports = getJobData;
      

      您不需要锁,因为当您使用 await 时,代码实际上是同步的 如果您使用回调,您将需要锁。

      【讨论】:

      • 这种方法的唯一“问题”是它们的查询不是并行运行的。代码将在每个 await 处“等待”以继续下一个。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-21
      • 2017-05-10
      • 2018-05-07
      • 2015-12-16
      • 1970-01-01
      • 2016-04-10
      • 1970-01-01
      相关资源
      最近更新 更多