错误:HTTP 错误 400,请求有错误。 Firebase Firestore 云函数
Posted
技术标签:
【中文标题】错误:HTTP 错误 400,请求有错误。 Firebase Firestore 云函数【英文标题】:Error: HTTP Error 400, The Request has errors. Firebase Firestore Cloud Functions 【发布时间】:2018-03-30 19:03:46 【问题描述】:运行命令 firebase deploy 时出现此错误:
我正在部署功能
i 函数:确保启用必要的 API...
i runtimeconfig:确保启用必要的 API...
✔ runtimeconfig:启用所有必要的 API
✔ 功能:启用所有必要的 API
i 函数:为上传准备函数目录...
i 函数:用于上传的打包函数 (4.04 KB)
✔functions:functions文件夹上传成功
我开始发布过程(可能需要几分钟)...
i 函数:创建函数 followerNotification...
⚠函数:创建函数followerNotification失败
⚠函数:HTTP错误:400,请求有错误
⚠ 功能:1 个功能部署失败。
函数部署有错误。要继续部署其他功能(例如 >database),请运行: firebase deploy --except 函数
错误:函数未正确部署。
有问题吗?试试 firebase deploy --help
其他一切都可以正常工作。仅当我尝试使用 Firebase Firestore 制作东西时。
【问题讨论】:
【参考方案1】:问题是你只引用了一个集合而不是一个文档,比如:
exports.myFunctionName = functions.firestore
.document('users').onWrite((event) =>
// ... Your code here
);
您需要参考以下文档:
exports.myFunctionName = functions.firestore
.document('users/marie').onWrite((event) =>
// ... Your code here
);
您还可以使用通配符,例如:
exports.myFunctionName = functions.firestore
.document('users/userId').onWrite((event) =>
// ... Your code here
);
这里有描述:https://firebase.google.com/docs/functions/firestore-events
希望我能帮上忙
【讨论】:
前两个函数是一样的!【参考方案2】:对我来说,没有一个答案对我有帮助。最后我得到了一个步骤列表(来自谷歌)来查明问题。如果你运行:
firebase --debug --only functions deploy
它将给出更详细的错误消息,在我的情况下:
HTTP RESPONSE BODY <?xml version='1.0' encoding='UTF-8'?><Error><Code>EntityTooLarge</Code><Message>Your proposed upload is larger than the maximum object size specified in your Policy Document.</Message><Details>Content-length exceeds upper bound on range</Details></Error>
【讨论】:
它有帮助。我不知道函数名称的最大长度是 63 这是最通用的答案,适用于遇到此错误消息的任何人,谢谢!【参考方案3】:如果有人仍然遇到这种情况,在我的情况下,解决方案是运行 npm install -g firebase-tools
来更新 cli,并添加
"engines":
"node": "8"
到 package.json
【讨论】:
【参考方案4】:Okej,这就是您需要查看的内容。
因为你有
exports.yourFunctionName = functions.firestore.document
您需要查看的是.document
您的路径必须指向一个文档,而不是一个集合。
所以这将不起作用:
/level1/level1Id/level2
这会起作用:
/level1/level1Id/level2/level2Id
当文档有动作
时,云函数会寻找希望这对任何人都有帮助
【讨论】:
【参考方案5】:如果您使用了错误的 Node 版本,也会发生这种情况。我刚刚在处理函数时将我的节点版本设置为 8.x 后体验到了这一点。切换回 v10.x,问题就消失了。
【讨论】:
【参考方案6】:我遇到这种情况是因为导出函数名称开头的下划线。你可以自己测试一下:
exports._someLongNameWithUnderscore= functions.auth.user().onCreate(user =>
return true;
);
exports.someLongNameWithoutUnderscore= functions.auth.user().onCreate(user =>
return true;
);
exports.shortName= functions.auth.user().onCreate(user =>
return true;
);
开头或结尾有下划线的将失败并显示HTTP:400
,其他将部署。
【讨论】:
【参考方案7】:这也发生在我身上,然后我意识到在第二级,firestore 只允许文档而不是集合。
我正在尝试收听这条路径:
/collection/document/wildcard
你可以做类似的事情
/collection/wildcard
或
/collection/document/collection/wildcard
【讨论】:
同样的问题!奇怪的是没有描述性的错误信息。 Okej,这不可能是答案,因为无论你去多少级都没有关系。你可以尽可能多地嵌套它。看我的回答 @ivan :您轻松地为我节省了 3-4 小时!谢谢你:) 这条消息在 2021 年 7 月仍然很神秘,包括通过用于云功能的 Web 编辑器。按照 adamduren 的回答,将这个答案与从路径中删除错误的斜线相结合是我的解决方案。【参考方案8】:在我更改函数名称之前,我也遇到了同样的错误
create_template_
到
create_new_template
可能是函数名末尾的'_'(下划线)导致了这个错误。
【讨论】:
【参考方案9】:还想指出,linter 将拒绝侦听器声明时的换行符,即:
exporst.myFunc = functions.firestore
.document('collection/uid')
.onEvent(...)
linter 没有多大帮助,也没有包含在文档中(像往常一样)
【讨论】:
【参考方案10】:在尝试发布以数字字符开头的 Cloud pub/sub 函数时,我遇到了同样的错误。
exports.nightly_pruning = functions.pubsub.topic('24hr-tick').onPublish((event) =>
...
);
只需更改名称即可修复它:
exports.nightly_pruning = functions.pubsub.topic('nightly-tick').onPublish((event) =>
...
);
(感谢上面的 Nikolai Hegelstad。我没有评论的声誉。)
【讨论】:
我觉得这有点吵,然后才是真正的答案。您基本上刚刚实施了 Nikolai 的解决方案。您应该编辑他们的答案以包含一个示例,或者考虑获得足够的声誉来发表评论/点赞。 这是一个真实的答案。我考虑过获得更多的声誉——回答这样的问题就是这样做的方法。我只是想尽可能地增加价值,并且由于我目前的声誉(因为我没有花很多时间来回馈堆栈溢出,这是我唯一可以做到的)。【参考方案11】:我对相同错误消息的问题是 Cloud Functions 的 pubsub 似乎不支持名称以数字字符开头的主题。
【讨论】:
【参考方案12】:这个问题可能是由函数名的长度引起的。
所以,如果名字是:
myFunctionsFromWorksWithCustumersTiggersTests
换一个更短的名字,比如:
WorkWithCustumers
我希望我有所帮助。
【讨论】:
谢谢!从一些玩弄,看起来函数名称的最大长度为 64 个字符。【参考方案13】:我也有这个问题。就我而言,这是因为我的触发器路径在文档路径中有一个斜杠。
如此变化:
functions.firestore
.document('some_path/pushId/')
收件人:
functions.firestore
.document('some_path/pushId')
帮我修好了。这似乎是由各种问题引起的,firebase cli 没有很好地解释原因。
【讨论】:
我遇到了这个问题和 Ivan 目前接受的答案中的一个以上是关于错误:HTTP 错误 400,请求有错误。 Firebase Firestore 云函数的主要内容,如果未能解决你的问题,请参考以下文章
逻辑错误的 HTTP 400(错误请求),不是格式错误的请求语法