You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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();
    });
  });
};

额外优化建议

  1. 替换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;
  }
};
  1. 完善错误捕获:增加JSON解析错误、响应流错误的监听,避免未处理异常导致Lambda静默失败。

内容的提问来源于stack exchange,提问作者Jaafar Abazid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 09:20:18