AWS Lambda函数在Promise解析前终止,如何使其等待执行完成?
解决AWS Lambda提前终止表单上传的问题
你的Lambda函数提前终止的核心原因是:async类型的handler没有返回异步操作的Promise,导致Lambda认为同步代码执行完毕后直接结束进程,完全忽略了还在运行的表单上传任务。
修复方案(核心修改:返回Promise)
修改后的代码会让Lambda等待Promise解析完成,直到上传和响应处理全部结束:
import request from 'request'; import FormData from 'form-data'; export const handler = async (event, context) => { // 关键:返回这个Promise,让Lambda等待异步操作完成 return new Promise((resolve, reject) => { const form = new FormData(); console.log('Streaming ...'); form.append('file', request('https://cdn.mysite.com/video.mp4')); console.log('Uploading ...'); form.submit('https://www.someapi.com/upload', (error, response) => { if (error) { console.error('Upload failed:', error); return reject(error); } let body = ''; response.on('data', chunk => { console.log('Receiving response ...'); body += chunk.toString(); }); response.on('end', () => { console.log('Done ...'); try { resolve(JSON.parse(body)); } catch (parseErr) { reject(parseErr); } }); // 新增响应错误监听,避免静默失败 response.on('error', rejErr => reject(rejErr)); response.resume(); }); }); };
额外优化建议
- 替换
request库:request已停止维护,建议使用axios或node-fetch这类活跃维护的库,示例用axios实现流式上传:
import axios from 'axios'; import FormData from 'form-data'; import request from 'request'; export const handler = async (event, context) => { const form = new FormData(); const fileStream = request('https://cdn.mysite.com/video.mp4'); form.append('file', fileStream); try { console.log('Uploading ...'); const response = await axios.post('https://www.someapi.com/upload', form, { headers: form.getHeaders(), responseType: 'stream' }); let body = ''; await new Promise((res, rej) => { response.data.on('data', chunk => { console.log('Receiving response ...'); body += chunk.toString(); }); response.data.on('end', res); response.data.on('error', rej); }); console.log('Done ...'); return JSON.parse(body); } catch (error) { console.error('Process failed:', error); throw error; } };
- 完善错误捕获:增加JSON解析错误、响应流错误的监听,避免未处理异常导致Lambda静默失败。
内容的提问来源于stack exchange,提问作者Jaafar Abazid
相关产品推荐
相关产品推荐

