正在寻求有关如何解决此错误的帮助。我试图根据每个月内发生的交易总数来获取每月的交易总数。
下面是我的代码,
exports.monthlyTotalArray = async (req, res) => {
const { userId } = req.body;
const requestMonths = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
const today = new Date();
var relevantYear = today.getYear();
try {
return await Transaction.findAll({
where: {
userId: userId,
},
}).then((transactions) => {
if (transactions.length == 0) {
res.status(401).json({
message: { msgBody: "No transactions found", msgError: true },
});
} else {
const MonthlyArray = requestMonths.forEach((requestMonth) => {
transactions
.filter((i) => {
const date = new Date(i.date);
return (
date.getMonth() == requestMonth &&
date.getYear() == relevantYear
);
})
.reduce((prev, curr) => prev + parseFloat(curr.amount), 0);
res.status(200).send({
MonthlyArray,
});
});
}
});
} catch (error) {
res.status(500).send({
message: error.message || "some error occurred",
});
}
};
当我尝试运行代码时出现此错误
{
"message": "Cannot access 'MonthlyArray' before initialization"
}
答案 0 :(得分:0)
似乎您正在foreach()lambda表达式中访问MonthlyArray。但是MonthlyArray实际上是由该foreach()的结果初始化的,因此您的确在初始化MonaryArray之前就在访问它。
这可能不是您想要的,但发送响应的代码部分位于lambda表达式内。
很难看到,因为代码的缩进使得很难太了解lambda表达式的结尾。
正确缩进代码很可能使代码显而易见。
答案 1 :(得分:0)
主要问题是您要在res.send({ MonthlyArray })
的回调函数中调用requestMonths.forEach
,所以这就是为什么出现错误的原因。
const MonthlyArray = requestMonths.forEach((requestMonth) => {
// you're calling it here
res.status(200).send({
MonthlyArray,
});
});
// instead, it should be here
res.status(200).send({
MonthlyArray,
});
另外,您可能不想使用forEach
,因为forEach
不返回任何内容,因此MonthlyArray
将是undefined
。而是使用Array.map
获得所需的结果。
if (transactions.length == 0) {
// ...
} else {
const MonthlyArray = requestMonths.map((requestMonth) => {
return transactions
.filter((i) => {
const date = new Date(i.date);
return (
date.getMonth() == requestMonth && date.getYear() == relevantYear
);
})
.reduce((prev, curr) => prev + parseFloat(curr.amount), 0);
});
res.status(200).send({
MonthlyArray,
});
}