javascript 如何在特定时间呼叫路线

vlf7wbxs  于 2023-02-21  发布在  Java
关注(0)|答案(1)|浏览(94)

我有一个MERN堆栈图书馆管理系统网站。
在我的应用程序目前为管理员,我已经给了一个Notify按钮,发送电子邮件给所有用户,有任何图书到期的图书馆。为此,一个默认的用户数组作为一个请求体发送电子邮件。管理员得到这个列表的用户从数据库的初始渲染的特定组件。
但我想自动发送电子邮件,并希望我的服务器在上午10时触发自动电子邮件给所有用户谁有到期的书籍。
Notify按钮上单击我的notifyBookDefaulties控制器被触发。
我试图使用setTimeout和计时器以及调用我的路线在上午10:00和触发电子邮件,但我无法得到所需的输出。
下面是我的notifyBookDefaulties控制器:

const notifyBookDefaulties = asyncHandler(async (req, res) => {
  const admin = await Auth.findById(req.user.id);
  // to check if user exists by that id in the databse
  // and that user is a admin (got by token)
  if (!admin && admin.admin !== true) {
    res.status(401);
    throw new Error("Not Authorized");
  }
  const { users, bookID, title } = req.body; // here users is the list of user id's
  let emails = "";
  // to get email of each user from their user id
  for (let user of users) {
    try {
      const defaulty = await Auth.findById(user);
      emails += defaulty.email + ",";
    } catch (error) {
      res.status(400);
      throw new Error(error);
    }
  }
  // to get comma separated list of emails
  const emailList = emails.slice(0, -1).toString();
  // try block tries to send email and catch block catches any error if occured
  try {
    var transporter = nodemailer.createTransport({
      service: process.env.SERVICE,
      auth: {
        user: process.env.USER,
        pass: process.env.PASS,
      },
    });
    var mailOptions = {
      from: process.env.USER,
      to: emailList,
      subject: "Return Book",
      html: `<!DOCTYPE html><html lang="en"><body>This is to remind you that the book titled ${title} and ID ${bookID} issued by you is due.</body></html>`,
    };
    transporter.sendMail(mailOptions, function (error, info) {
      if (error) {
        res.status(400).json({ msg: error });
      } else {
        res.status(200).json({ msg: "E-Mail Successfully sent" });
      }
    });
  } catch (error) {
    console.log(error);
    res.status(500).json({ msg: error });
  }
});

下面是我的服务器.js:

require("dotenv").config();
const express = require("express");
const { errorHandler } = require("./middleware/errorMiddleware");
const connectDB = require("./config/db");
const cors = require("cors");
const port = process.env.PORT || 5000;

  connectDB();
  
  const app = express();
  
  const corsOptions = {
    origin: 'http://localhost:3000',
    optionsSuccessStatus: 204
  };

  app.use(cors(corsOptions))
  app.use(express.json());
  app.use(express.urlencoded({ extended: false }));

  app.use("/api/admin", require("./routes/adminRoutes"));
  app.use("/api/user", require("./routes/userRoutes"));
  app.use("/api/actions", require("./routes/authRoute"));

  app.use(errorHandler);

  app.listen(port, () => {
    console.log(`Running on ${port}`);
  });

我的管制员收到以下路线的呼叫:

router.post("/notify", protect, notifyBookDefaulties);

并且URL是:

http://localhost:5000/api/admin/notify

注:这里我没有包括我的功能,获取用户ID的列表,用户有到期的书籍。获取默认的用户,我有一个单独的控制器,我会合并到这个控制器,一旦我得到的逻辑发送邮件在上午10:00。
如果有任何其他的方式来实现这一点,我想知道。如果任何更明确的需要做告诉。提前感谢。

相关问题