Node.js 为什么谷歌云存储在授予公众访问权限时不允许文件上传?

Node.js 为什么谷歌云存储在授予公众访问权限时不允许文件上传?,node.js,file-upload,google-cloud-storage,Node.js,File Upload,Google Cloud Storage,在我的node.js服务器中,我有一个post请求,请求向谷歌云存储上传2次——每个上传到不同的存储桶中 当我测试功能时,我能够成功地将2个文件上载到2个不同的存储桶,但在下一次测试中,2个上载中的1个失败并引发错误:错误:无法加载默认凭据 为什么在第二次测试中只有一次上传失败? 如果它是一个完全公共的bucket(所有用户都有读/写/管理的完全对象访问权限),为什么它会说不能加载凭据 我希望有人能解释为什么在第一次测试后它就停止工作了。上载已调整大小的图像的函数在两个测试中都起作用,但上载原始

在我的node.js服务器中,我有一个
post
请求,请求向谷歌云存储上传2次——每个上传到不同的存储桶中

当我测试功能时,我能够成功地将2个文件上载到2个不同的存储桶,但在下一次测试中,2个上载中的1个失败并引发错误:
错误:无法加载默认凭据

为什么在第二次测试中只有一次上传失败?
如果它是一个完全公共的bucket(所有用户都有读/写/管理的完全对象访问权限),为什么它会说不能加载凭据

我希望有人能解释为什么在第一次测试后它就停止工作了。上载已调整大小的图像的函数在两个测试中都起作用,但上载原始文件的函数在第二个测试中失败,引发错误:
error:无法加载默认凭据

更新


经过多次测试,我可能推断这是一个文件大小问题。缩略图上传每次都有效,而全尺寸图像在大小达到~2-3MB时失败。阅读GCS文档,它说5TB是最大的单文件上传限制,所以我不知道为什么会有一些MB的问题。我不想降低图像大小/分辨率,因为它们是需要以全尺寸观看的艺术作品(这正是我首先创建缩略图的原因)。

看起来您的凭据没有加载。正在使用的服务凭据。 你已经试过跑步了吗

gcloud auth应用程序默认登录


另外,这两个程序的bucket权限是否相同?

这个问题是我通过彻底的研究和反复试验(几周,我并不感到自豪)解决的。我知道我需要在
const storage=new storage()中添加验证参数(我的问题不是这样,我现在知道应该是这样的)

最初,我打算使用
.env
文件以我所知道的各种方式传入
项目id
client_secrets.json
文件。但是在第n次重新阅读文档之后,我发现了它的正确语法

我需要创建
项目id
的常量以及它所在的
.json
文件的位置,并将这些常量作为如下参数传入:

const projectId = 'project-id';
const keyFileName = "client_secret.json";
const storage = new Storage({projectId, keyFileName});

有些时候上传失败的原因是因为我获得了上传较小对象的免费通行证,但一旦上传的文件大小达到~3MB,就需要进行不存在的验证。我仍然不完全理解,但我就是这样解决的。

Hi@PsiKai您确认您的第二个存储桶确实配置了公共访问吗?考虑到这个函数工作得很好,而且问题只存在于这个bucket上,因此问题似乎存在于那里的权限上。你能确认一下第二个桶是否真的是公开的吗?在这种情况下,您也可以尝试将其公开。是的,我99.98%确定它们都是公开的,而且我还为“所有用户”添加了读取和写入两个存储桶中的对象的完全权限,以及两个存储桶的管理员存储桶权限。。。经过进一步测试,我试图上传的图像中大约有一半有相同的问题,另一半工作正常。图像大小似乎无关紧要,它们都是jpeg格式的。我想知道是不是同时有两个异步函数导致了这个问题,但是我对异步的了解还不够,所以不能确定。。可能是时间问题
async
可能确实是个问题,具体取决于代码的编写方式。请您尝试一下,每次执行一个,而不是两个都是异步的,好吗?除此之外,您还可以获得有关执行并行函数的更多详细信息。我只是尝试运行错误的函数not async,但收到了相同的
无法加载默认凭据的
错误。所以可能不是这样。对这两者的权限是相同的,是的。我没有尝试加载任何凭据,因为我认为使用公共访问我不需要加载任何凭据。我在谷歌开发环境之外做这个项目,所以很难获得独立项目的指导。我可以在我的超级终端上运行这样的命令吗?是否像键入该命令一样简单?如果您安装了gcloud SDK,则是。它将打开您的浏览器并要求您登录。我已安装SDK并登录,但现在无法将任何内容上载到存储,应用程序会立即崩溃,并说
错误:无法在当前环境中检测到项目Id。
我需要在这里做什么?Hi@PsiKai您需要首先运行命令
gcloud config set Project[PROJECT\u ID]
设置要配置凭据的项目。替换
[PROJECT\u ID]
关于你的项目的id,它正在使用云存储。@gso_gabriel我按照你的指示做了,但它仍然给出了相同的错误,即
错误:无法在当前环境中检测到项目id。
并且不允许我上传甚至列出文件。应该注意的是,虽然这解决了我在开发环境中的问题在我将站点部署到生产环境时,同样的问题也发生了。
const projectId = 'project-id';
const keyFileName = "client_secret.json";
const storage = new Storage({projectId, keyFileName});