我有一个网络应用程序,我尝试使用Heroku进行部署。我使用Google Cloud Node.js库来访问Google云端存储。我的服务器文件顶部有以下内容:
const gcs = require('@google-cloud/storage')({
projectId: 'my-project-ID',
credentials: process.env.GCS_KEYFILE
});
GCS_KEYFILE是我使用Heroku命令行工具使用heroku config:set GCS_KEYFILE="$(< /my/file.json)"
检查仪表板以确保已确认JSON文件的内容已设置为config var。屏幕截图如下所示:
当我尝试使用gcs
执行任何操作时出现的错误是:
Error: Could not authenticate request
The incoming JSON object does not contain a client_email field
这没有任何意义,因为它显然有效。 json本身很好;我直接从Google Cloud下载了该下载而未对其进行修改。我尝试在keyFileName
声明中使用const gcs
,但我收到了ENAMETOOLONG
错误(加上the docs say用于指定JSON文件路径的错误)。当我使用keyFileName
并指定JSON文件的路径时,它在本地工作,因此我非常确定JSON本身不是问题。
关于我为什么会收到此错误的任何想法?或者是否有更好的方法在Heroku上处理来自Google的JSON Keyfiles?
答案 0 :(得分:5)
heroku或任何地方的环境变量都是字符串。
如果谷歌api构造函数采用JSON对象,您可能需要执行类似的操作将其转换回JSON:
const gcs = require('@google-cloud/storage')({
projectId: 'my-project-ID',
credentials: JSON.parse(process.env.GCS_KEYFILE)
});
答案 1 :(得分:1)
为此有一个有用的heroku buildpack
heroku buildpacks:add --index 1 https://github.com/buyersight/heroku-google-application-credentials-buildpack.git
--index 1
是因为“应用程序主要语言的构建包应该是最后添加的构建包”,因此,如果您有其他构建包,请注意这一点。