node.js接收上传图片,将图片信息写入数据库与解析form数据完成时向前台发送数据异步的问题

发布于 2022-09-06 06:32:53 字数 437 浏览 18 评论 0

后台接收前台传来的form表单数据,数据为图片。用的是formidable这个插件,然后经过处理后写入数据库,在form.on('end')的时候,再把数据库的图片数据返回给前台,问题就出在这了,往数据库插入数据是异步的动作,form.on('end')的时候数据不一定插进去了,如果在插入成功的回调内发送数据,单图可以,多图因为循环,就会报错:can't set headers after they are sent
现在想到的解决办法是在form.on('end')内写个定时器,等一会再发送,可是这样不稳定,谁知道这段特定时间后,数据有没有插入完成呢

clipboard.png

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

葬シ愛 2022-09-13 06:32:53

使用 event (http://nodejs.cn/api/events.html)自定义事件并监听即可,数据库都操作完成再触发事件向前端传输数据。

青巷忧颜 2022-09-13 06:32:53

异步编程的难度就在这些地方,一个动作的开始要依赖其他的动作完成作为标记。而你的逻辑就是:

  1. 所有图片上传
  2. 1完成后开始查询数据库
  3. 2完成后给res返回数据

所以流程上面看起来跟form.on('end')好像没有任何关系,为什么要在这个事件里面做操作?
另外我不明白的一点是要返回给客户端的到底是什么,latestFileData?那Upload.find({}...)查出来的又是什么?
res.json只能调用一次,如果你两者都想返回,那必须等结果都就绪后合成一个json再调用。
类似的流程在NodeJS里面以后还会经常遇到,根本的解决方式是使用一些流程控制的库,我比较常用的有2个:

  1. async,你需要使用的是parallel或是parallelLimit,就是一系列可以并行的任务都完成后触发一个回调,这时候你就可以用res.json了;
  2. Bluebird,需要使用Promise.all,原理同上,语法上不太一样。

文档和习惯上面个人更喜欢前者。不管哪一个都会了async/await,这是最新的标准,也是以后的方向,建议早些了解。

你列表最软的妹 2022-09-13 06:32:53

这个简单的,把异步转为同步

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文