android - AWS Lambda:errorMessage进程在完成请求之前退出
问题描述
嗨,我是android的新手!
我想将图像文件从 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;
}
解决方案
欢迎来到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 函数名称并检查最新日志以查找错误消息。
第二 -在这里查看我的答案,所以当你的函数成功时,你需要向 API Gateway 返回一个有效的 HTTP 响应,所以本质上如果你从那里使用我的代码,你可以这样做:
callback(null, responder.success({someJson: someValue}))
任何问题让我知道:-)
编辑:我正在更新这个问题我只是在研究一个将多个文件上传到 S3 的示例!
推荐阅读
- string - 在循环的每个步骤中更改文件名(索引)
- excel - 如何将spss输出的唯一手段和sds放入excel?
- python - 无法将自定义 Python 宏导入 Airflow 2
- spring-boot - 如何使用 Spring RestTemplate 为 POST 请求设置超时?
- swift - 如何跳过 NSCollectionView 中的第一个单元格?
- python - 如何在循环python中使用子字符串制作字典
- ios - IOS UIKit 触摸/移动延迟
- c++ - 将值存储在从文件 c++98 读取的对象的数组或向量中
- reactjs - 如何在 React 中使用刷新令牌保持刷新令牌
- java - 无法在 IE 中执行 Selenium Java