Javascript 发送网格电子邮件Api发送电子邮件3次

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

我正在使用send grid email api发送电子邮件以验证用户帐户。出于某种原因,每次生成3封电子邮件而不是一封,每封都有不同的令牌。我使用同样的方法来生成令牌和发送电子邮件来重置密码,这非常好。但是,电子邮件验证令牌被发送了3次

此代码是next.js api的源代码。以下是我的代码:

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,或者使用回调。哪种方法最好?