当前位置: 首页 > 知识库问答 >
问题:

AWS Lambda:errorMessage进程在完成请求之前退出

邵和硕
2023-03-14

我想从android客户端上传图像文件到服务器(服务器制作缩略图,并返回缩略图的url)。

然而,我塞进了这个错误消息。

{"errorMessage":"RequestId: 8e2a21b8-e62e-11e8-8585-d9b6fdfec9b9 Process exited before completing request"}!

我试着在stackoverflow中找到这个错误代码,但是我找不到Android的答案。

const AWS = require('aws-sdk');
const multipart = require("parse-multipart");
const s3 = new AWS.S3();
const bluebird = require('bluebird');

exports.handler = function(event, context) {
    let result = [];
    const bodyBuffer = new Buffer(event['body-json'].toString(), 'base64');
    const boundary = multipart.getBoundary(event.params.header['Content-Type']);
    const parts = multipart.Parse(bodyBuffer, boundary);
    const files = getFiles(parts);

    return bluebird.map(files, file => {
        console.log('UploadCall');
        return upload(file)
        .then(
            data => {
                result.push({
                    'bucket': data.Bucket,
                    'key': data.key,
                    'fileUrl': file.uploadFile.fullPath })
                console.log( `DATA => ${JSON.stringify(data, null, 2 )}`);
                },
                err => {
                    console.log(`S3 UPLOAD ERR => ${err}`);
                }
            )
        })
        .then(_=> {
            return context.succeed(result);
        });
    }

    let upload = function(file) {
        console.log('PutObject Call')
        return s3.upload(file.params).promise();
    };

    let getFiles = function(parts) {
    let files = [];
    parts.forEach(part => {
        const buffer = part.data

        const fileName = part.filename;
        const fileFullName = fileName;

        const originBucket = 'dna-edge/images';
        const filefullPath = `https://s3.ap-northeast-2.amazonaws.com/${originBucket}/${fileFullName}`;

        const params = {
            Bucket: originBucket,
            Key: fileFullName,
            Body: buffer
        };

        const uploadFile = {
            size: buffer.toString('ascii').length,
            type: part.type,
            name: fileName,
            fullPath: filefullPath
        };
        files.push({ params, uploadFile })
    });
    return files;
};

这是客户端代码(imgURL看起来像/storage/emulated/0/dcim/img/1493742568136.jpg)

public static String requestHttpPostLambda(String url, String imgURL){

    /*
     await axios.post(`${AWS_LAMBDA_API_URL}?type=${type}`, formData,
{ headers: { 'Content-Type': 'multipart/form-data' }})
.then((response) => {result = response});
     */
    String result=null;
    try {
        HttpClient client = new DefaultHttpClient();
        String postURL = url;
        HttpPost post = new HttpPost(postURL);
        post.setHeader("Content-Type", "multipart/form-data");

        File file = new File(imgURL);
        MultipartEntityBuilder builder = MultipartEntityBuilder.create();
        builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
        builder.addPart("image", new FileBody(file));
        post.setEntity(builder.build());

        HttpResponse responsePOST = client.execute(post);
        Log.e("HttpResponse", responsePOST.getStatusLine()+"");
        HttpEntity resEntity = responsePOST.getEntity();
        if (resEntity != null) {
            result = EntityUtils.toString(resEntity);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return result;
}

共有1个答案

魏宏邈
2023-03-14

欢迎使用StackOverflow。

因此,由于某些原因,AWS不太好更新文档,不要使用context.success,使用作为第三个参数传递的回调。

另外,我将移到Node8.10运行时,因为您可以使用async/await而不是使用promissions/then模式。

export default(event, context, callback) => {

    try {

        // do some stuff

        callback(null, SOME_VALID_HTTP_RESPONSE)
    } catch(e){

        callback(e, null)
    }
}
callback(null, responder.success({someJson: someValue}))
 类似资料:
  • 这是我正在研究的完全未来的例子 首先我从SupplySync调用compose方法,在这里我执行方法composeMethod,有三毫秒的延迟,然后它将创建一个文件并返回一个字符串作为结果。完成后,我调用Run方法,它只打印一个方法,然后有一个非阻塞方法从主线程运行。 我在这里面临的问题是,主线程执行完nonblockingmethod()并在3毫秒延迟之前退出进程,而随后的composeMeth

  • 我试图理解Python线程的“守护进程”标志。这我知道 线程可以标记为“守护线程”。此标志的意义在于,当只剩下守护进程线程时,整个Python程序将退出。初始值从创建线程继承。 但在我的例子中,python程序在守护进程线程离开并且线程没有完成其工作之前退出。 主程序 第一个线程只写5000个第一个整数,而第二个线程不写任何数字

  • 问题内容: 主线程将在子线程完成执行之前退出? 我读了两篇文章 http://www.cs.mtu.edu/~shene/NSF-3/e-Book/FUNDAMENTALS/thread- management.html 在以上文章的“线程终止”段中,它用红色表示“如果父线程终止,则其所有子线程也终止。” http://www.roseindia.net/java/thread/overview-

  • 问题内容: 我遇到了一个问题,其中发生了多个异步请求,这些请求从Facebook API和Firebase数据库获取图像和信息。我想执行所有异步请求,然后将从Facebook API / Firebase数据库获取的所有数据存储到一个可以快速加载的完整对象中。我为每个异步请求设置了完成处理程序,我认为这会迫使程序“等待”直到请求完成,然后继续执行程序,但这似乎对我不起作用。以下是我的尝试: 我知道

  • 问题内容: 用户单击执行某些Ajax请求的链接-假设此请求需要20秒钟。 在请求完成之前,用户单击oder链接,该链接会将整个页面重定向(无ajax)到另一个页面。 ajax请求会发生什么?它总是在服务器端完成,但是响应不会在任何地方出现?还是服务器端的ajax请求将立即被“杀死? 我问是因为我有一些脚本需要花费一些时间才能运行,但是用户现在不必知道结果-只是一发不可收拾-也许ajax中甚至有一些

  • 在退出脚本(TCL/Bash)之前,如何确保所有后台进程都已完成执行。 我想把我所有的后台进程PID写到一个pidfile中。然后在最后pgrep PID file,看看在我退出之前是否还有进程在运行。 有什么更简单的方法吗?而TCL有没有具体的办法做到这一点呢?