开发者问题收集

此无服务器函数已崩溃

2023-10-30
359

我正在尝试在 vercel 中部署后端 express 应用程序,其中服务器仅使用 nodemailer 处理邮件 api。

我的 package.json

image package.json

这是我的 server.js

import express from "express";
import cors from "cors";
import bodyParser from "body-parser";
import nodemailer from 'nodemailer';
import { config } from "dotenv";
config()

const app = express();
app.use(bodyParser.json({ limit: "100mb" }));
app.use(bodyParser.urlencoded({ limit: "100mb", extended: true }));
app.use(cors({credentials:true}));


const transporter = nodemailer.createTransport({
     service: 'gmail',
     auth: {
         user: process.env.EMAIL_USER, // Use environment variables instead of hardcoding
         pass: process.env.EMAIL_PASSWORD, // Use environment variables instead of hardcoding
}
});

function sendEmail(req, res) {
const { name, email, message } = req.body;

const mailOptions = {
    from: process.env.EMAIL_USER,
    to: process.env.RECIEVER_MAIL,
    subject: `You got a message from ${name}`,
    html: `<h4>Hello, Someone Contacted you through contact Form</h4>
    <h4>Name: ${name}</h4>
    <h4>Email: ${email}</h4>
    <p>Message: ${message}</p>
    `
    ,
};

transporter.sendMail(mailOptions, function (error, info) {
    if (error) {
        console.log(error);
        res.status(500).json({code:500, error: 'Failed to send email' });
    } else {
        console.log('Email sent: ' + info.response);
        res.status(200).json({code:200,success: 'Email sent successfully' });
    }
});
}
app.get('/', (req, res)=>{
    res.send("This is my api running!")
})

app.post('/contact', (req, res) => {
    sendEmail(req, res);
});

const PORT = process.env.PORT || 5000;

app.listen(process.env.PORT,()=>{
    console.log(`App listening on port ${PORT}`)
})

这是我的 vercel.json

{
"version": 2,
"builds": [
  {
    "src": "server.js",
    "use": "@now/node"
  }
],
"routes": [
  {
    "src": "/(.*)",
    "dest": "server.js"
  }
]

>

我在日志中收到的错误。

未捕获的异常 {"errorType":"ReferenceError","errorMessage":"require 未在 ES 模块范围内定义,您可以改用 import\n此文件被视为 ES 模块,因为它具有 '.js' 文件扩展名和'/var/task/package.json' 包含“type”:“module”。要将其视为 CommonJS 脚本,请将其重命名为使用“.cjs”文件扩展名。","stack":["ReferenceError: require 未在 ES 模块范围中定义,您可以改用 import","此文件被视为 ES 模块,因为它具有“.js”文件扩展名,并且 '/var/task/package.json' 包含“type”:“module”。要将其视为 CommonJS 脚本,请将其重命名为使用 '.cjs' 文件扩展名。"," at file:///var/task/___now_launcher.js:1:18"," at ModuleJob.run (node:internal/modules/esm/module_job:194:25)"]} 未捕获异常 {"errorType":"ReferenceError","errorMessage":"require 未在 ES 模块范围内定义,您可以改用 import\n此文件被视为 ES 模块,因为它具有 '.js' 文件扩展名,并且 '/var/task/package.json' 包含 "type": "module"。要将其视为 CommonJS 脚本,请将其重命名为使用 '.cjs' 文件扩展名。","stack":["ReferenceError: require 未在 ES 模块范围内定义,您可以改用 import","此文件被视为 ES 模块,因为它具有 '.js' 文件扩展名,并且 '/var/task/package.json' 包含 "type": "module"。要将其视为 CommonJS 脚本,请将其重命名为使用“.cjs”文件扩展名。"," at file:///var/task/___now_launcher.js:1:18"," at ModuleJob.run (node:internal/modules/esm/module_job:194:25)"]} 发生未知应用程序错误 Runtime.Unknown

2个回答

从包 json 中删除“type”:“module”,然后重试。

Kamran
2023-10-30

将您的 vercel.json 更改为:

{
"version": 2,
"builds": [
  {
    "src": "server.js",
    "use": "@vercel/node"
  }
],
"routes": [
  {
    "src": "/(.*)",
    "dest": "server.js"
  }
]

@now/node 命令现已于 2021 年弃用,并且不会再收到任何更新。 @vercel/now 现在是最佳选择!

THE BLUE FRIEND
2024-03-13