[英]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.