Node.js调用ipfs.files.add时await无效 二维码提前生成如何解决
问题原因
你代码的核心问题是混用了回调函数和async/await两种异步写法,导致await完全没生效,执行时序错乱:
- 当你给
ipfs.files.add传入第二个回调函数参数时,该接口会直接走回调触发逻辑,不会返回Promise对象 - 对非Promise类型的值加
await不会产生任何阻塞效果,代码会直接往下执行 - 实际执行顺序是:调用add接口传入回调→立刻执行后续二维码生成逻辑(此时上传还没完成,回调还没触发,
filehash根本没被赋值)→上传完成后才会触发回调里的hash赋值、打印逻辑,这时候二维码早就执行完了,自然不符合预期。
修复方法
两种写法二选一,绝对不能混着用,优先推荐第一种async/await写法:
方案1:纯async/await写法(推荐)
去掉回调函数,直接用await接收上传接口的返回值,所有依赖上传结果的逻辑按顺序写在后面即可,错误捕获用try/catch实现:
try { const addResult = await ipfs.files.add(testBuffer) // 不同js-ipfs版本返回结构略有差异,取hash/path字段就是文件的IPFS标识 const filehash = addResult[0].hash || addResult[0].path console.log(filehash) console.log("printed filehash") const qrcodepic = await qr.generateQRCode(filehash, EmpName, EmpId, IDate) console.log(qrcodepic) return qrcodepic } catch (err) { console.log('上传或生成二维码出错:', err) // 按需处理错误逻辑 }
方案2:纯回调写法
如果坚持用回调模式,就不要加await,并且把所有依赖上传结果的逻辑(也就是二维码生成、返回值相关逻辑)全部放到回调函数内部:
ipfs.files.add(testBuffer, function (err, file) { if (err) { console.log(err) return } const filehash = file[0].hash || file[0].path console.log(filehash) console.log("printed filehash") qr.generateQRCode(filehash, EmpName, EmpId, IDate).then(qrcodepic => { console.log(qrcodepic) // 注意:回调模式下无法在外层直接return结果,需要自己处理返回逻辑,比如传入外层回调、触发事件等 }) })
提示:回调写法容易出现回调嵌套、错误捕获分散、返回值处理麻烦的问题,非必要不要选这种方案。
内容的提问来源于stack exchange,提问作者Shreya Haridas
相关产品推荐
相关产品推荐

