将@react-email/components与nodemailer一起使用时出现ERR_MODULE_NOT_FOUND错误

问题描述 投票:0回答:1

我正在创建一个聊天应用程序,并希望添加每当新用户注册该应用程序时向用户发送电子邮件的功能。我在后端使用 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)
})
reactjs node.js express email nodemailer
1个回答
0
投票

nodemailer 不是一个后端包,至少我认为它在 Nodejs 后端上完美工作已经广泛使用了它

© www.soinside.com 2019 - 2024. All rights reserved.