我尽了最大努力自己解决了这个问题,但我完全错过了一些东西。
我使用NextJS12和谷歌云翻译的API来转换按钮上的单词。在本地,它运行良好,但一旦我尝试部署到vercel,权限/密钥就会在某个地方出错。
在本地,我有我的key.json,这是我从服务帐户获得的。它只是在我的项目的根。我的.env.local
文件引用了该密钥文件。看起来像这个
GOOGLE_APPLICATION_CREDENTIALS=./<projectid&key>.json
但当我试图翻译时,我遇到了一个错误。'Request failed with status code 500'
我的翻译端点看起来像这样,我几乎是从谷歌的小教程中复制的。
import { NextApiRequest, NextApiResponse } from "next";
export default async (req: NextApiRequest, res: NextApiResponse) => {
const translationClient = new TranslationServiceClient();
const projectId = <myprojectID>;
const location = "global";
async function translateText() {
const request = {
parent: `projects/${projectId}/locations/${location}`,
contents: [req.body.text],
mimeType: "text/plain",
sourceLanguageCode: "en",
targetLanguageCode: "es",
};
const [response] = await translationClient.translateText(request);
res.json(response.translations[0].translatedText);
}
translateText();
};
我尝试过的东西
- 将JSON作为单个环境变量放在vercel上。所以它基本上是
GOOGLE_APPLICATION_CREDENTIALS
和key.json文件 - 试着把它放在一行
- 试着把钥匙拆开,做成这样的格式:
GOOGLE_ACCOUNT_TYPE=service_account
GOOGLE_PROJECT_ID=project11111
GOOGLE_PRIVATE_KEY_ID=11111111111111
etc
然而,我也不打算让这种方法在本地工作。4.将.env.local
的路径保留到key.json,并上传了key.json本身。
这些都不起作用,我很失落。
我看过的资源
- https://github.com/vercel/vercel/issues/749#issuecomment-715009494
- 使用firebase privateKey作为Heroku配置变量逃避问题
- https://daveteu.medium.com/call-google-cloud-function-from-vercel-serverless-hosting-1b1688bb462c
我试着把这些应用到我的情况中,但我想不通。我真的很感激任何帮助!非常感谢。
环顾四周几天后,我找到了一个有效的解决方案。
我使用类似的命令将keys.json
转换为base64字符串。https://gist.github.com/tomi/0675e58919af4554b198cee3f84405e5
然后使用这里找到的方法。https://github.com/orgs/vercel/discussions/219
我把base64字符串放在.env文件中的一行中进行检查,然后对Vercel环境变量也进行了检查,结果成功了。