繁体   English   中英

如何使用 Node.js 将异步数据库查询结果从一个模块返回到另一个模块?

[英]How do I return an asynchronous DB query result from one module to another using Node.js?

我是 Node 的新手,我正在尝试遵循 Udemy API 课程中的模式。 API的结构是利用路由,controller和业务模块进行流量。 数据库查询将作为服务运行,并且应该从控制器调用。

我需要运行一系列数据库查询来生成一个列表(在此示例中,我只显示了 6 个查询中的 2 个)。 我在我的 function 中使用 async/await 运行这些查询。查询工作正常。 当我尝试在过程结束时将“批处理结果”(所有查询的结果)返回到 controller 时,我的问题就出现了。 我得到Promise { <pending> } 我已经尝试了很多东西,但我无法结束 promise 以从我的 controller 模块访问最终结果——我只能从我的服务模块访问它。

这是我的 controller 模块 (groups.controller.js) 中的代码,我将其称为 function:

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};

当我通过 postman 发送帖子时,我得到了预期的查询结果(如下)。 但是,如果我将res放入我的服务模块,我只能让它工作。

{
    "Q1": [
        {
            "PropertyID": 0
        }
    ],
    "Q2": [
        {
            "SubGroupID": 397
        }
    ]
}

有没有办法以这种模式结束 promise 并返回所需的批处理响应? 谢谢你。

编辑:添加@traynor 提供的代码更新。

新 controller:

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};

该服务现在返回 promise,并且它还在处理响应而不是 controller。

要从服务返回,您需要承诺服务:返回一个 promise,它会在您获取数据库数据或出错时解析,然后您还需要等待该服务,它被包装在try/catch中以进行错误处理。

完成后,处理来自 controller 的响应:

服务:

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);
        }
    });

controller:

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');
    }

}    

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM