Node.js异步.on函数返回值异常问题求助
问题分析与解决方案
问题根源
response.data.pipe(writeStream)返回的是目标流对象(即writeStream),所以你定义的uploadedUrl本质是个Stream实例,不是你期望的签名URL。finish是异步事件,回调函数里的return无法被外部代码捕获——外部的console.log("uploadedURL: ",uploadedUrl)会在finish触发前就执行,自然拿不到后续生成的signedUrls[0]。
修复方案
把整个上传+获取签名URL的逻辑封装成Promise,通过resolve/reject传递结果,这样就能用async/await等待异步操作完成:
async function uploadAndGetSignedUrl(response, file, writeStream) { return new Promise((resolve, reject) => { response.data.pipe(writeStream) .on('finish', async () => { console.log('Successfully uploaded image: '); const signedUrls = await file.getSignedUrl({ action: 'read', expires: '03-09-2491' }); console.log("signedUrls: ", signedUrls); resolve(signedUrls[0]); }) .on('error', (err) => { console.error('Error uploading image:', err); reject(""); }); }); } // 调用示例(需在async函数内执行) const uploadedUrl = await uploadAndGetSignedUrl(response, file, writeStream); console.log("uploadedURL: ", uploadedUrl);
补充说明
- 用
Promise包裹Stream的异步事件,把finish的成功结果通过resolve抛出,错误通过reject抛出。 - 如果无法在async函数中调用,也可以用
.then()链式处理:uploadAndGetSignedUrl(response, file, writeStream) .then(url => console.log("uploadedURL: ", url)) .catch(err => console.error(err));
内容的提问来源于stack exchange,提问作者AWood
相关产品推荐
相关产品推荐

