我是 Node 新手,我正在嘗試遵循 Udemy API 課程中的模式。API 的結構是利用路由、控制器和服務模塊進行流程。資料庫查詢將作為服務運行,并且應該從控制器呼叫。
我需要運行一系列資料庫查詢來生成一個串列(在這個例子中我只顯示了 6 個查詢中的 2 個)。我在我的函式中使用 async/await 運行這些。查詢作業正常。當我嘗試在流程結束時將“批處理結果”(所有查詢的結果)回傳給控制器時,就會出現我的問題。我明白了Promise { <pending> }。我已經嘗試了很多事情,但我無法結束從我的控制器模塊訪問最終結果的承諾——我只能從我的服務模塊訪問它。
這是我的控制器模塊(groups.controller.js)中的代碼,我在其中呼叫了我的函式:
const groupsService = require('../services/groups.service');
exports.propertyList = (req, res, next) => {
const uid = req.body.uid;
const batchResponse = groupsService.batchQuery(uid, res);
console.log(batchResponse);
}
這是我運行查詢的服務模塊(groups.services.js)中的代碼:
const mysql = require('mysql2');
const dbAsync = require("../config/db.config");
async function batchQuery(uid, res) {
var Q1;
var Q2;
var uid = uid * -1;
const pool = mysql.createPool(dbAsync.dbAsync);
const promisePool = pool.promise();
try {
Q1 = await promisePool.query('SELECT PropertyID FROM GroupMembership WHERE GroupID = ?', [uid]);
Q2 = await promisePool.query('SELECT SubGroupID FROM GroupMembership WHERE GroupID = ? AND PropertyID = ?', [uid, 0]);
}
catch(error) {
console.log(error);
res.status(401).send('Server error');
return error;
}
finally {
const batchResponse = {
Q1: Q1[0],
Q2: Q2[0]
}
console.log('Q1: ' Q1[0][0].PropertyID ', Q2: ' Q2[0][0].SubGroupID);
res.status(200).send(batchResponse);
return batchResponse;
}
}
module.exports = {batchQuery};
當我通過郵遞員發送帖子時,我得到了預期的查詢結果(如下)。但是,只有將我的服務模塊放入我的服務模塊,我才能讓它作業res。
{
"Q1": [
{
"PropertyID": 0
}
],
"Q2": [
{
"SubGroupID": 397
}
]
}
有沒有辦法以這種模式結束承諾并回傳所需的批處理回應?謝謝你。
編輯:添加@traynor 提供的代碼更新。
新控制器:
const groupsService = require('../services/groups.service');
exports.propertyList = async (req, res, next) => {
const uid = req.body.uid;
let batchResponse;
try {
batchResponse = await groupsService.batchQuery(uid);
console.log(batchResponse);
return res.status(200).send(batchResponse);
} catch(error) {
console.log('Error: ' error);
return res.status(401).send('Server error');
}
}
新服務:
const mysql = require('mysql2');
const dbAsync = require("../config/db.config");
function batchQuery(uid) {
return new Promise((resolve, reject) => {
var Q1;
var Q2;
var uid = uid * -1;
const pool = mysql.createPool(dbAsync.dbAsync);
const promisePool = pool.promise();
try {
Q1 = await promisePool.query('SELECT PropertyID FROM GroupMembership WHERE GroupID = ?', [uid]);
Q2 = await promisePool.query('SELECT SubGroupID FROM GroupMembership WHERE GroupID = ? AND PropertyID = ?', [uid, 0]);
} catch(error) {
console.log(error);
reject(error);
} finally {
const batchResponse = {
Q1: Q1[0],
Q2: Q2[0]
}
console.log('Q1: ' Q1[0][0].PropertyID ', Q2: ' Q2[0][0].SubGroupID);
resolve(batchResponse);
}
})
}
module.exports = {batchQuery};
uj5u.com熱心網友回復:
該服務現在回傳一個承諾,并且它也在處理回應而不是控制器。
要從服務回傳,您需要承諾服務:回傳一個承諾,當您獲得資料庫資料或錯誤時解決,然后您還需要等待服務,它包含在 try/catch錯誤處理中。
完成后,處理來自控制器的回應:
服務:
function batchQuery(uid) {
return new Promise(async (resolve, reject) => {
var Q1;
var Q2;
//...
try {
//...
} catch (error) {
console.log(error);
reject(error);
} finally {
const batchResponse = {
Q1: Q1[0],
Q2: Q2[0]
}
console.log('Q1: ' Q1[0][0].PropertyID ', Q2: ' Q2[0][0].SubGroupID);
resolve(batchResponse);
}
});
控制器:
exports.propertyList = async (req, res, next) => {
const uid = req.body.uid;
let batchResponse;
try {
batchResponse = await groupsService.batchQuery(uid);
console.log(batchResponse);
res.status(200).send(batchResponse);
} catch(error) {
return res.status(401).send('Server error');
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/452183.html
