【问题标题】:AWS Lambda : errorMessage Process exited before completing requestAWS Lambda:errorMessage进程在完成请求之前退出
【发布时间】:2018-11-12 22:28:47
【问题描述】:

大家好,我是安卓新手!

我想将图像文件从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;
}

【问题讨论】:

  • 我认为这是您的代码错误。 “Process exited before completed request”表示Javascript函数在调用return context.succeed(result);之前退出
  • @ppshein 你的意思是服务器代码有错误,对吧?我以为 android 代码有错误...因为服务器在 React Web 客户端中运行没有问题。
  • 关于错误消息,该消息Process exited before completing request 通常来自服务器端。

标签: android aws-lambda


【解决方案1】:

欢迎使用 stackoverflow。

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

此外,我会迁移到 Node 8.10 运行时,因为那时您可以使用 async/await,而不是使用 promises/then 模式。

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

    try {

        // do some stuff

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

        callback(e, null)
    }
}

您的 Lambda 可能会失败有几个原因,如果进程在完成之前退出它会崩溃或者您没有返回有效的 HTTP 响应(如果您的 lambda 在 API 网关后面)

两种解决方案 - 首先查看 cloudwatch,找到您的 lambda 函数名称并检查最新日志以查找错误消息。

第二 - 查看我的回答 here,所以当你的函数成功时,你需要向 API Gateway 返回一个有效的 HTTP 响应,所以本质上如果你使用我的代码,你可以这样做:

callback(null, responder.success({someJson: someValue}))

有任何问题请告诉我:-)

编辑:我正在更新这个问题我只是在研究一个将多个文件上传到 S3 的示例!

【讨论】:

    猜你喜欢
    • 2018-03-25
    • 1970-01-01
    • 2015-08-03
    • 1970-01-01
    • 2017-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多