如何迭代strapi.db.query的结果?

How to iterate over the result of strapi.db.query?

我的控制器中有一个简单的 findMany 查询:

const appointments = strapi.db.query("api::appointment.appointment").findMany({
    select: ["date", "startTime", "endTime"],
    where: {
        mentorId: mentorId,
        status: [1, 2, 4]
    }
});

下面是returns,这样的结构让我觉得返回的结果是可迭代的

[
    {
        "date":"2022-04-27",
        "startTime":"08:00:00.000",
        "endTime":"10:00:00.000"
    },
    {
        "date":"2022-04-27",
        "startTime":"10:00:00.000",
        "endTime":"12:00:00.000"
    }
]

然而,当我使用 for 循环时,我可以看出它甚至没有进入,因为没有输出。

for (let appointment in appointments)
    console.log("I entered");

当我使用forEach时,我得到了error: appointments.forEach is not a function

appointments.foreach(function(appointment) {
    console.log(appointment.date);
});

因此,我随后使用 Symbol.iterator in Object(appointments) 检查它是否可迭代,但它 returns falseArray.isArray(appointments) 也 returns false 这很奇怪,因为结果对我来说确实像一个数组。

有什么解决方法吗?我需要遍历每个对象,并访问它的字段。

编辑 - 整个控制器文件:

"use strict";

/**
 *  availability controller
 */

const { createCoreController } = require("@strapi/strapi").factories;

module.exports = createCoreController("api::availability.availability", ({strapi}) => ({
    async getFreeSlots(ctx) {
        const mentorId = ctx.params.mentorId;

        const appointments = strapi.db.query("api::appointment.appointment").findMany({
            select: ["date", "startTime", "endTime"],
            where: {
                mentorId: mentorId,
                status: [1, 2, 4]
            }
        });
        console.log(appointments);

        return appointments;
    }
}));

.findMany() 方法是异步的,returns 是 Promise。我想您是想在通话后立即同步使用它。你需要 await 它。

const appointments = await strapi.db.query("api::appointment.appointment").findMany({
    select: ["date", "startTime", "endTime"],
    where: {
        mentorId: mentorId,
        status: [1, 2, 4]
    }
});
console.log(appointments);

或者,如果您不在 async 函数中(需要使用 await),您可以使用 Promise 中的经典 .then()

strapi.db.query("api::appointment.appointment").findMany({
    select: ["date", "startTime", "endTime"],
    where: {
        mentorId: mentorId,
        status: [1, 2, 4]
    }
}).then((appointments) => {
    console.log(appointments);
    /*...*/
});