我有一个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。
如果有任何其他的方式来实现这一点,我想知道。如果任何更明确的需要做告诉。提前感谢。
1条答案
按热度按时间w1jd8yoj1#
听起来像一个cron作业,检查这个包https://www.npmjs.com/package/node-cron