如何迭代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 false
。 Array.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);
/*...*/
});
我的控制器中有一个简单的 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 false
。 Array.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);
/*...*/
});