获取错误:在Sendgrid API的Next js应用程序中' personalizations '期望数组



我有一个文件在我的api文件夹名为sendAlerts.js我一直得到错误:数组期望的personalizations在http://localhost:3000/api/sendAlerts

这是我的代码,在api/sendAlerts:
const mail = require('@sendgrid/mail');
mail.setApiKey(process.env.SENGRID_APIKEY);
export default async (req, res) => {
await mail.send({
personalizations: `${req.body.personalizations}`,
from: 'david.gregory.medero@gmail.com',
subject: `${req.body.subject}`,
text: `${req.body.message}`
});
res.status(200).json({ status: 'Ok' });
}
下面是将消息提交给API端点的函数:
async function handleOnSubmit() {
await fetch('/api/sendAlerts', {
body: JSON.stringify({
personalizations: [personalizationState],
subject: `${product.title} in size ${variantTitle} is now available!`,
message: `${product.title} in size ${variantTitle} is now available!`,
}),
headers: {
'Content-Type': 'application/json',
},
method: 'POST',
})
}

我的personalizationState在控制台中看起来是这样的:

0: {to: Array(1), bcc: Array(2)}

0:bcc:数组(2)0: {email: 'dmederoudemy@gmail.com'}1: {email: 'dmedero@getwrecked.com'}

:数组(1)0: {email: 'david.gregory.medero@gmail.com'}

我不知道为什么我得到这个错误。我的personalizationState在数组中。我错过什么了吗?

编辑:为了清晰起见,我重构了submit函数:
async function handleOnSubmit() {
await fetch('/api/sendAlerts', {
body: JSON.stringify({
personalizations: [
{
"to": [
{
"email": "david.gregory.medero@gmail.com"
}
],
"bcc": [
{
"email": "dmederoudemy@gmail.com"
}, 
{
"email": "dmedero@getwrecked.com"
}
]
}
],
subject: `${product.title} in size ${variantTitle} is now available!`,
message: `${product.title} in size ${variantTitle} is now available!`,
}),
headers: {
'Content-Type': 'application/json',
},
method: 'POST',
})
}

在您的api/sendAlerts文件中,您将发送函数中的personalization属性设置为字符串。您需要删除从req中获得个性化的模板文字。在这里看到的:

const mail = require('@sendgrid/mail');
mail.setApiKey(process.env.SENGRID_APIKEY);
export default async (req, res) => {
await mail.send({
personalizations: req.body.personalizations, // no need for template literal assuming the personalizationState is an array
from: 'david.gregory.medero@gmail.com',
subject: `${req.body.subject}`,
text: `${req.body.message}`
});
res.status(200).json({ status: 'Ok' });
}

另外,从您的personalizationState的日志判断,您也不需要将其包装在数组中,因为它已经是一个数组。所以在将消息提交给API端点的函数中你应该将其更改为:

personalizations: personalizationState, // personalizationState looks already like an array, no need for []

UPDATE:请参阅下面的代码,我创建了一个Test组件,它呈现一个发送到API端点的按钮。此外,从api/sendAlerts中删除了模板文字。下面是api/sendAlerts:

const mail = require("@sendgrid/mail");
mail.setApiKey(process.env.SENGRID_APIKEY);
export default async (req, res) => {
await mail.send({
personalizations: req.body.personalizations,
from: "<YOUR_EMAIL_ADDRESS>@gmail.com",
subject: `${req.body.subject}`,
text: `${req.body.message}`,
});
res.status(200).json({ status: "Ok" });
};

这是Test组件,只需将其导入到任何地方并运行测试来检查:

const TestButton = () => {
async function handleOnSubmit() {
await fetch("/api/sendAlerts", {
body: JSON.stringify({
personalizations: [
{
to: [
{
email: "<<YOUREMAIL@gmail>>.com",
},
],
},
],
subject: "Test Message",
message: "Here is a test message",
}),
headers: {
"Content-Type": "application/json",
},
method: "POST",
});
}
return <button onClick={handleOnSubmit}>Send Email</button>;
};
export default TestButton;

最新更新