我有一个在 Vercel 上运行的 CRON 作业。但是每当我尝试运行它时,我都会收到 504: GATEWAY_TIMEOUT 错误。我检查了 Vercel 上我的 Cron Job 函数的日志,一切似乎都很好。所以我继续对 504 状态代码进行了一些研究,我了解到这表明无服务器功能响应时间过长。Vercel 对无服务器功能的超时限制为 10 秒。所以我需要优化这段代码,使其在 10 秒的时间范围内执行。请建议优化代码。
import dbconnection from "@/lib/dbconn";
import Birthday from "@/models/Birthday";
dbconnection()
export default async function handler(req, res) {
try {
const query = Birthday.find({ date: new Date() }).lean();
const birthdays = await query.exec();
for (const birthday of birthdays) {
const client = twilio(process.env.TWILIO_ACCOUNT_SID, process.env.TWILIO_AUTH_TOKEN);
const message = await client.messages.create({
messagingServiceSid: 'MG19c8d8f851ee2e2525446fc35d1667ab',
body: `Subramanya, Today is ${birthday.name}'s Birthday!. Don't Forget to wish🎉`,
from: process.env.TWILIO_PHONE_NUMBER,
to: process.env.MY_NUMBER,
});
console.log(`Sent message to Subramanya's Number at ${birthday.date}: ${message.sid}`);
}
} catch (error) {
console.error(error);
}
}
代码简要说明:- 我正在连接到数据库(MongoDB),然后从生日集合中查询数据并检查条件,如果满足条件,我将使用 Twillio 发送消息。这是一个 nextJS 代码,我正在使用 mongoose作为我的司机。
你得到了一个
504: GATEWAY_TIMEOUT error
,因为你没有回复。您必须使用 res.send()
返回响应。
另外,您可以修改下面的代码。以便您的功能快速执行。
import dbconnection from "@/lib/dbconn";
import Birthday from "@/models/Birthday";
dbconnection()
export default async function handler(req, res) {
try {
await Birthday.find({ date: new Date() }).lean().then(async(birthdays)=>{
for (const birthday of birthdays) {
const client = twilio(process.env.TWILIO_ACCOUNT_SID, process.env.TWILIO_AUTH_TOKEN);
const message = await client.messages.create({
messagingServiceSid: 'MG19c8d8f851ee2e2525446fc35d1667ab',
body: `Subramanya, Today is ${birthday.name}'s Birthday!. Don't Forget to wish🎉`,
from: process.env.TWILIO_PHONE_NUMBER,
to: process.env.MY_NUMBER,
});
console.log(`Sent message to Subramanya's Number at ${birthday.date}: ${message.sid}`);
}
});
res.send({message: "All message sent successfully."})
} catch (error) {
console.error(error);
}
}