我正在创建一个聊天应用程序,并希望添加每当新用户注册该应用程序时向用户发送电子邮件的功能。我在后端使用 Node.js、Expressjs,在前端使用 Reactjs。每当我在 authConroller.js 中包含
import Email from '../../frontend/src/components/email/email.js'
时,就会显示以下错误
检查此屏幕截图以查看 ERR_MODULE_NOT_FOUND 错误。
在此屏幕截图中,package.json 文件用于后端文件夹。 frontend 文件夹有它自己的 package.json 文件。我尝试删除node_modules并重新安装它,但它不起作用。 nodemailer 和 @react-email/components 包都安装在 package.json 中
下面是前端文件夹中的email.js。
import nodemailer from 'nodemailer'
import { render } from '@react-email/components';
import { WelcomeEmail } from './welcome';
class Email {
constructor(user, url) {
this.to = user.email
this.firstName = user.name.split(' ')[0]
this.url = url
this.from = `<${process.env.EMAIL_FROM}>`
}
newTransport() {
return nodemailer.createTransport({
host: process.env.EMAIL_HOST,
port: process.env.EMAIL_PORT,
auth: {
user: process.env.EMAIL_USERNAME,
pass: process.env.EMAIL_PASSWORD
}
})
}
async sendWelcome() {
const emailHtml = render(WelcomeEmail({ url: this.url, firstName: this.firstName }))
const mailOptions = {
from: this.from,
to: this.to,
subject: 'Welcome to ChatApp!',
html: emailHtml
}
await this.newTransport().sendMail(mailOptions)
}
}
export default Email
下面是前端文件夹中的welcome.jsx
import React from "react";
import { Html, Button, Preview, Text } from "@react-email/components";
export const WelcomeEmail = ({ url, firstName }) => {
return (
<Html lang="en" dir="ltr">
<Preview>Welcome to ChatApp</Preview>
<Text>Hello {firstName}</Text>
<Text>{url}</Text>
<Button href="https://example.com" style={{ color: "#61dafb" }}>
Click me
</Button>
</Html>
);
};
下面是后端文件夹中的authController.js
import jwt from 'jsonwebtoken'
import path from 'path'
import { fileURLToPath } from 'url'
import crypto from 'crypto'
import User from '../models/userModel.js'
import catchAsync from '../utils/catchAsync.js'
import AppError from '../utils/appError.js'
import Email from '../../frontend/src/components/email/email.js'
const __filename = fileURLToPath(import.meta.url)
const __dirname = path.dirname(__filename)
const signToken = id => {
return jwt.sign({ id }, process.env.JWT_SECRET, {
expiresIn: process.env.JWT_EXPIRES_IN
})
}
const createSendToken = (user, statusCode, req, res) => {
const token = signToken(user._id)
const cookieOptions = {
expires: new Date(Date.now() + process.env.JWT_COOKIE_EXPIRES_IN * 24 * 60 * 60 * 1000),
httpOnly: true /
}
if (process.env.NODE_ENV === 'production') cookieOptions.secure = true
res.cookie('jwt', token, cookieOptions)
//excluding password in the output from the
user.password = undefined
res.status(statusCode).json({
status: "success",
token,
user
})
}
export const signup = catchAsync(async (req, res) => {
const newUser = await User.create(req.body)
const url = `${req.protocol}://${req.get('host')}/me`
await new Email(newUser, url).sendWelcome()
createSendToken(newUser, 201, req, res)
})
nodemailer 不是一个后端包,至少我认为它在 Nodejs 后端上完美工作已经广泛使用了它