前端保存数据到后台时请求数据太大该怎么处理?

2019 年 8 月 28 日
 rizon

前端有个文本输入框可以输入大量文本,后端 nodejs 接受数据限制了请求 body 最大 xMB, 不知道该怎么处理这种场景。求支招。

现在想的一个方法是,把数据切片后,分片上传,后台合并分片后保存。

但我更想的是后台直接保存分片的数据,存储是 mongodb 的,把分片数据保存到一个 map 里,key 就是分片的 index。 这样每次只要更新指定 index 的数据就好了。但是有个问题就是,如果前台输入框的文本内容做了删除操作,那么分片就会减少,也就是 index 的范围就要变小,比如从过去的 1-10 十个分片变成了 1-5 五个分片,那么我就要删除 6-10 这几个 key 的数据,mongodb 有什么办法可以根据 key 的值的范围批量删除吗?

4724 次点击
所在节点    程序员
18 条回复
chendy
2019 年 8 月 28 日
个人的不成熟想法:
1,把”修改“传给后端,比如删掉了从 index1 到 index2 之间的内容,在 index1 后面添加了什么内容这样子
2,后端把修改重现到数据库中的数据上
于是新的问题来了
1,巨大的数据频繁往返于数据库和应用,对内存和网络都是不小的压力,于是要考虑做应用级的缓存,应用级的缓存是本地的不是分布式的…不想了
2,还要处理修改本号,数据版本号之类的问题,防止数据乱掉…不想了
rizon
2019 年 8 月 28 日
@chendy #1 这个方案我也想过因为太麻烦,而且变化量的块太多了则需要一些方案来保证数据的一致性。太费劲了。
Sparetire
2019 年 8 月 28 日
一般这种大小限制都是框架限制的吧, 那就直接修改框架选项调大一点就好了吧, 但是总归是要限制一个大小的
Vegetable
2019 年 8 月 28 日
建议不要因为一个配置问题而去修改逻辑。
singerll
2019 年 8 月 28 日
你把数据库改了,万一其他业务以后需要这一部分数据咋办
limuyan44
2019 年 8 月 28 日
既然服务端做了限制为什么客户端可以传这么大既然客户端传这么大为什么服务端做了限制,既然你一定要传这么大为什么不去修改服务端限制跑去修改逻辑
loudefa
2019 年 8 月 28 日
这种还是服务端改限制好,分片得改代码。。麻烦
mikoshu
2019 年 8 月 28 日
文本输入框也不至于输入超过限制的文本大小吧.. 那得写多少东西 ... 是不是有图片类的文件被转成了 base64 导致文本大小变大 如果过是 应该考虑图片或者文件改成链接
murmur
2019 年 8 月 28 日
分 trunk 上传啊,有 fileupload 组件支持前端分 trunk 得
chairuosen
2019 年 8 月 28 日
当技术实现不了的时候:这个需求有问题
enjoyCoding
2019 年 8 月 28 日
??? 诛仙正本小说才 1.5M
Augi
2019 年 8 月 28 日
互相矛盾,建议修改服务端限制,node 本身有啥限制,你说的是 http 的 body 体积吧,这个都是可以配置的。
vanishcode
2019 年 8 月 28 日
需求不知道,方案设计肯定有问题,这种 MB 级的文本应该搞成文件上传
flyingghost
2019 年 8 月 28 日
1,大文件分片上传没错。但存储分片更多的带来麻烦不会带来多少收益。一般不分片存储。比如跨分片搜索、匹配、解码、修改等各种操作。
2,如果非要分片存储,可以把每个分片做 hash。无论初次还是后续上传,按分片做 hash 来判断是否可以“秒传”。然后传输那些 hash 无法匹配的分片即可。
3,新的分片们到达服务器,依然按 hash/id 做存储。文件元数据本身会保存拥有的所有分片的索引。
4,每个分片有引用计数,定期删除没有引用的分片。

以上都是脑洞。
我们的做法是直传阿里云等各种云存储,自带 SDK 支持秒传、分片等信息。云存储后给业务层传个最终结果 key 就可以了。这样存储子系统和业务子系统可以独立,业务子系统不用修改巨大的 body 体积上限,也不用占用巨大的带宽和连接时长。
Sapp
2019 年 8 月 28 日
你直接把限制放大不就行了... 真有这个需求,为什么不放开限制呢,而且你究竟是传了多大的文字...
shakaraka
2019 年 8 月 28 日
文字转 blob,分片上传
red2dog
2019 年 8 月 29 日
你这是有多大啊 上传视频吗
songjiaxin2008
2019 年 9 月 3 日
@flyingghost #14 正解,前端直传,云存储提供商 callback 后端。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://v2ex.xtra.eu.org/t/595789

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX