首页 > 解决方案 > ENOENT:没有这样的文件或目录,打开 '/var/task/google-cloud-key.json' Vercel

问题描述

请帮我解决..

我的JS file文件在 Next JS 应用程序根文件夹中,Next JS app > pages/api/profile并且在 package.json 所在的位置。google-cloud-key.json

在本地一切正常,但低于 Vercel 给出的错误

ENOENT: no such file or directory, open '/var/task/google-cloud-key.json' vercel

我的 google-cloud-key.json 位于下一个 JS 应用程序的根目录中。

我也试过下面的代码:

const storage = new Storage({
            projectId: 'careful-relic-319511',
            keyFilename: __dirname + '/../../../google-cloud-key.json'
        });

这现在给出以下错误:

ENOENT: no such file or directory, open '/var/task/.next/server/google-cloud-key.json'] {\n  errno: -2,\n  code: 'ENOENT',\n  syscall: 'open',\n  path: '/var/task/.next/server/google-cloud-key.json'\n}\nEND

标签: javascriptnode.jsreactjsnext.jsvercel

解决方案


嘿,我找到了一个很好的解决方案

  1. Base64 对 json 文件进行编码。(https://www.base64encode.org/

  2. 设置一个 env 变量(在本地和 vercel 设置中)这个编码的字符串。(在我的情况下是 GCP_CRED_FILE)

const gcsKey = JSON.parse(
  Buffer.from(process.env.GCP_CRED_FILE, 'base64').toString()
);

const storage = new Storage({
  credentials: {
    client_email: gcsKey.client_email,
    private_key: gcsKey.private_key
  },
  projectId: gcsKey.project_id
});

这对我有用。使用 nextjs 11 和 vercel 部署进行了测试

此外,您不需要将文件存储或推送到存储库或存储它(这可能是一个安全威胁)


推荐阅读