NextJS/Vercel未在生产环境中的公共文件夹中提供.pdf文件

jdgnovmf  于 2023-05-22  发布在  其他
关注(0)|答案(2)|浏览(150)

我的公共文件夹(next js app)中有一个PDF文件,我将其附加到电子邮件(sendgrid)中。
在开发中,一切都运行良好。当我运行build + run start时也是如此。所以我想这和维塞尔有关。当我检查生产(Vercel)中的日志时,我看到以下错误:
错误:ENOENT:没有这样的文件或目录,打开“public/assets/Bonus_1.pdf”
有什么办法解决这个问题吗?
下面是相关代码:

const pathToAttachment1 = path.join("public", "assets", "Bonus_1.pdf")
const attachment1 = fs.readFileSync(pathToAttachment1).toString("base64");
    
sgMail.setApiKey(process.env.SENDGRID_API_KEY);
const msg = {
     to: process.env.NODE_ENV === "development" ? "info@test.com" : email,
     from: "test",
     attachments: [
            {
              content: attachment1,
              filename: "Bonus_1.pdf",
              type: "application/pdf",
              disposition: "attachment",
            },
          ],
          templateId: "xxx",
        };
sgMail.send(msg).then(() => {res.status(200).json({ message: "Mail sen!" });
});

为了检查公共目录中的资产,我添加了以下代码:

const files = fs.readdirSync(path.join("public", "assets"))
console.log("files:", files)

输出如下所示:

files: [
  '1.png',
  'Bonus_1.pdf' ]
7eumitmz

7eumitmz1#

我最初假设您在app目录下运行代码(在我的测试中,您的代码运行得非常好),但我最终能够在pages/api下复制您的问题。
path.resolve应该解决您的错误:

const file = fs
  .readFileSync(path.resolve("public/assets/Bonus_1.pdf"))
  .toString("base64");
voj3qocg

voj3qocg2#

如果文件包含在公共目录中,则您提供的路径是错误的。资源路径中不包括公用文件夹。
考虑到这一点,你的路径应该是:/assets/Bonus_1.pdf .
记住
Vercel的部署文件系统是只读的,因此任何会导致文件被打开或修改的操作(如使用fs模块的某些方法)在部署到云时都会出错。

相关问题