Javascript 发送网格电子邮件Api发送电子邮件3次
我正在使用send grid email api发送电子邮件以验证用户帐户。出于某种原因,每次生成3封电子邮件而不是一封,每封都有不同的令牌。我使用同样的方法来生成令牌和发送电子邮件来重置密码,这非常好。但是,电子邮件验证令牌被发送了3次 此代码是next.js api的源代码。以下是我的代码:Javascript 发送网格电子邮件Api发送电子邮件3次,javascript,reactjs,email,next.js,sendgrid,Javascript,Reactjs,Email,Next.js,Sendgrid,我正在使用send grid email api发送电子邮件以验证用户帐户。出于某种原因,每次生成3封电子邮件而不是一封,每封都有不同的令牌。我使用同样的方法来生成令牌和发送电子邮件来重置密码,这非常好。但是,电子邮件验证令牌被发送了3次 此代码是next.js api的源代码。以下是我的代码: import nc from "next-connect"; import crypto from "crypto"; import sgMail from &q
import nc from "next-connect";
import crypto from "crypto";
import sgMail from "@sendgrid/mail";
import { connectToDatabase } from "../../../util/mongodb";
export const config = {
api: {
externalResolver: true,
},
};
const handler = nc().post(async (req, res) => {
const { email } = req.body;
const { db } = await connectToDatabase();
// //TTL Index for auto expiry,will be executed only once for index creation
// db.collection("tokens-email").createIndex(
// { createdAt: 1 },
// { expireAfterSeconds: 3600 } //1 hour in seconds
// );
db.collection("users").findOne({ email }, (error, user) => {
if (error)
return res
.status(500)
.json({ error: "an unknown error occured,please try again" });
if (!user) return res.status(400).json({ error: "user doesnt exist" });
if (user.isVerified)
return res
.status(200)
.json({ success: "This account has already been verified" });
const { name } = user;
//check if token already exists for this user;
db.collection("tokens-email").findOne({ email }, (error, token) => {
if (error)
return res
.status(500)
.json({ error: "an unknown error occured,please try again" });
//if token already exists,delete this token.
if (token)
db.collection("tokens-email").deleteOne({ email }, (error) => {
if (error)
return res
.status(500)
.json({ error: "an unknown error occured,please try again" });
});
//Create new token and save in db
const newToken = crypto.randomBytes(128).toString("hex");
db.collection("tokens-email").insertOne(
{
createdAt: new Date(),
token: newToken,
email,
},
(error) => {
if (error)
return res
.status(500)
.json({ error: "there was an unknown issue,please try again" });
sgMail.setApiKey(process.env.SENDGRID_API_KEY);
const msg = {
to: email,
from: "bm@basitminhas.com",
subject: "Saqee's Online Store",
text:
"Hello " +
name +
",\n\n" +
"Please verify your account by clicking the link:" +
process.env.CLIENT_URL +
"api/confirm/" +
newToken +
"\n\nThank You!\n",
};
sgMail
.send(msg)
.then(() =>
res.status(200).json({
success:
"A verification email has been sent to " +
email +
". It will expire after one day. If you didn't get verification Email click on resend token.",
})
)
.catch(() =>
res
.status(500)
.json({ error: "technical issue,please click on resend" })
);
}
);
});
});
});
export default handler;
有谁能告诉我为什么会发生这种情况以及解决方案是什么吗???您的控制流非常混乱。我建议您重写代码,坚持单一的异步样式:替换
,然后/catch
调用try
/catch
/async
/wait
。重写时,您将修复所有的控制流问题。还要分离函数…好的,谢谢,在我们进行重写时,处理异步操作的最佳方法是什么?然后使用try-catch块执行/catch,或者使用异步/wait,或者使用回调。哪种方法最好?