我对前端的响应为空,但在控制台中返回 OK

Empty result in my response to front-end, but in console is returning OK

所以,我有一个 REST API,我想 return 一些数据到我的前端。

所以我有这个代码:

.then(async result => {
            // return result.rows

            return result.rows.map(async res1 => {
                res1.datasProc = [];
                const getDatt = await getDatasProcedimentos(res1.GUIA_SENHA);
                res1.datasProc.push(...getDatt);
                console.log(res1);
                return res1;
            })
        })

第 2 行 return result.rows,没问题。但是我想用 map 方法在这个对象上添加一些数据。此数据来自第 6 行(SQL 查询)。我已经测试了查询功能及其工作正常。在第 8 行,我的 res1 对象包含我想要的所有数据,但结果是空的。

我的console.log(res1)

{
  NM_PESSOA_FISICA: 'name of someone',
  NR_CPF: 'document of someone',
  GUIA_SENHA: 'id of company',
  PROCEDIMENTO: 'procedure of someone in company',
  DATA: 'timestamp',
  DS_PROCEDIMENTO: 'description of procedure',
  datasProc: [
    { 'timestamp1' },
    { 'timestamp2' },
    { 'timestamp3' }
  ]
} ... and so on

我对前端的回应(使用端点失眠提示)

result = [
{},
{},
{},
{},
{},
{},
// ... and so on
]

我尝试过其他方法,比如将映射结果分配给变量并 returning 那个,但是异步块是先 returning 然后再做映射。

编辑 1:发送数据的控制器在 try-catch 块中:

try {
            const guiasPorPeriodo = await guiaDAO.getGuiasPorPeriodo(data_filtro_inicial, data_filtro_final, idClinic);

            if (guiasPorPeriodo) {
                return res.json({
                    "resultado": guiasPorPeriodo,
                    "status": "success",
                    "message": "enviado com sucesso"
                });
            } else {
                throw new Error('Ocorreu algum erro ao consultar as guias neste período.')
            }

        } catch (err) {
            return res.status(400).json({
                "status": "fail",
                "error message": `${err.name}: ${err.message}`
            });
        }

语言:pt-BR

问题出在您的 async/await 地图上。带有 await 的函数将 return 一个承诺,您需要等待承诺得到解决。尝试 Promise.all,应该等到你所有的承诺都得到解决。

.then(async result => {
            // return result.rows

            return Promise.all(result.rows.map(async res1 => {
                res1.datasProc = [];
                const getDatt = await getDatasProcedimentos(res1.GUIA_SENHA);
                res1.datasProc.push(...getDatt);
                console.log(res1);
                return res1;
            }))
        })

另一种方法是使用 for 循环。 async/await.

效果更好

这条语句:

return result.rows.map(async res1 => { 

将 return 一个 Promise 数组,而不是结果对象。为确保您的异步函数会 return 实际结果数组,我会尝试这样做:

.then(result => {
            // return result.rows

            return Promise.all(result.rows.map(async res1 => {
                res1.datasProc = [];
                const getDatt = await getDatasProcedimentos(res1.GUIA_SENHA);
                res1.datasProc.push(...getDatt);
                console.log(res1);
                return res1;
            }))
        })

映射器函数声明为异步,因此从技术上讲它 return 是一个承诺。 一个没有被声明为异步但 returns Promise 的函数仍然可以用 await.

调用