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

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

clipboard.png

阅读 4.1k
3 个回答

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

  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,这是最新的标准,也是以后的方向,建议早些了解。

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题