簡體   English   中英

Node.js-從多個MSSQL查詢返回數據

[英]Node.js - Returning data from multiple MSSQL queries

我剛開始學習Node.js,所以我仍然習慣於異步編程,回調和Promise。 我試圖在一個記錄集中從多個MSSQL查詢返回數據,但是我發現的大多數幫助文章都是關於MySQL的。

我嘗試按照此處接受的答案中所示的步驟進行操作: 使用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查詢中傳遞對象,從而使結果不是不確定的?

我認為您正在使它復雜化。 這是應該執行您所需的代碼:

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;

我認為您錯過了退貨聲明。 在第一個和第二個查詢try / catch塊中,您都應給作為return finishRequest()

您尚未將結果返回給函數,因此它以未定義的形式發送它,您可以更新語句,例如,查看代碼中的更新內容,請查找注釋//這是更新后的語句

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;

雖然我對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時 ,代碼實際上是同步的。如果您使用回調,則將需要鎖。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM