gpt4 book ai didi

node.js - AWS Lambda 在放置 s3 对象时出错

转载 作者:太空宇宙 更新时间:2023-11-03 23:16:15 26 4
gpt4 key购买 nike

我正在开发一个功能,当任何图像上传到存储桶中的图像文件夹时,该功能通过在屏幕截图文件夹中保存图像的缩略图版本来创建缩略图。我正在使用无服务器框架。我不断收到如下所示的错误。我已经粘贴了确切的代码,以便任何人都可以复制粘贴并实现此解决方案。还包括 Serverless.yml、处理程序函数文件以及任何支持文件。

我无法弄清楚当我指的是缓冲区时为什么会出现对象类型不是缓冲区等错误。

 { InvalidParameterType: Expected params.Body to be a string, Buffer, Stream, Blob, or typed array object
at ParamValidator.fail (/var/runtime/node_modules/aws-sdk/lib/param_validator.js:50:37)
at ParamValidator.validatePayload (/var/runtime/node_modules/aws-sdk/lib/param_validator.js:255:10)
at ParamValidator.validateScalar (/var/runtime/node_modules/aws-sdk/lib/param_validator.js:133:21)
at ParamValidator.validateMember (/var/runtime/node_modules/aws-sdk/lib/param_validator.js:94:21)
at ParamValidator.validateStructure (/var/runtime/node_modules/aws-sdk/lib/param_validator.js:75:14)
at ParamValidator.validateMember (/var/runtime/node_modules/aws-sdk/lib/param_validator.js:88:21)
at ParamValidator.validate (/var/runtime/node_modules/aws-sdk/lib/param_validator.js:34:10)
at Request.VALIDATE_PARAMETERS (/var/runtime/node_modules/aws-sdk/lib/event_listeners.js:125:42)
at Request.callListeners (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:105:20)
at callNextListener (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:95:12)
message: 'Expected params.Body to be a string, Buffer, Stream, Blob, or typed array object',
code: 'InvalidParameterType',
time: 2019-03-12T16:37:26.910Z }

代码:

处理程序.js

'use strict';

const resizer = require('./resizer');

module.exports.resizer = (event, context, callback) => {
console.log(event.Records[0].s3);

const bucket = event.Records[0].s3.bucket.name;
const key = event.Records[0].s3.object.key;

console.log(`A file named ${key} was put in a bucket ${bucket}`);

resizer(bucket, key)
.then(() => {
console.log(`The thumbnail was created`);
callback(null, {
message: 'The thumbnail was created'
});
})
.catch(error => {
console.log(error);
callback(error);
});
};

module.exports.thumbnails = (event, context, callback) => {
const bucket = event.Records[0].s3.bucket.name;
const key = event.Records[0].s3.object.key;

console.log(bucket);
console.log(key);

console.log(`A new file ${key} was created in the bucket ${bucket}`);
callback(null, {
message: `A new file ${key} was created in the bucket ${bucket}`
});
};

Resizer.js

'use strict';

const AWS = require('aws-sdk');
const S3 = new AWS.S3();
const Jimp = require('jimp'); //https://github.com/oliver-moran/jimp

module.exports = (bucket, key) => {
const newKey = replacePrefix(key);
const height = 512;

return getS3Object(bucket, key).then(data => resizer(data.Body, height)).then(buffer => putS3Object(bucket, newKey, buffer));
};

function getS3Object(bucket, key) {
return S3.getObject({
Bucket: bucket,
Key: key
}).promise();
}

function putS3Object(bucket, key, body) {
return S3.putObject({
Body: body,
Bucket: bucket,
ContentType: 'image/jpg',
Key: key
}).promise();
}

function replacePrefix(key) {
const uploadPrefix = 'uploads/';
const thumbnailsPrefix = 'thumbnails/';
return key.replace(uploadPrefix, thumbnailsPrefix);
}

function resizer(data, height) {
return Jimp.read(data)
.then(image => {
return image
.resize(Jimp.AUTO, height)
.quality(100) // set JPEG quality
.getBuffer(Jimp.MIME_JPEG, (err, buffer) => {
return buffer;
});
})
.catch(err => err);
}

无服务器.yml

service: serverless-resizer-project # NOTE: update this with your service name


provider:
name: aws
runtime: nodejs6.10
profile: student1

iamRoleStatements:
- Effect: "Allow"
Action:
- "s3:ListBucket"
- "s3:GetObject"
- "s3:PutObject"
Resource: "arn:aws:s3:::serverless-resizer-project-images/*"

functions:
resizer:
handler: handler.resizer
events:
- s3:
bucket: serverless-resizer-project-images
event: s3:ObjectCreated:*
rules:
- prefix: uploads/
- suffix: .jpg
thumbnails:
handler: handler.thumbnails
events:
- s3:
bucket: serverless-resizer-project-images
event: s3:ObjectCreated:*
rules:
- prefix: thumbnails/
- suffix: .jpg

最佳答案

resizer 函数的返回值不是您所期望的。您将 getBuffer 函数与回调一起使用,这意味着图像的缓冲区不是由 Promise 解析的,而是在回调中使用,这不是您的意图。您应该改用 getBufferAsync,它返回解析为图像缓冲区的 Promise。您的 resizer 函数应如下所示:

function resizer(data, height) {
return Jimp.read(data)
.then(image => image
.resize(Jimp.AUTO, height)
.quality(100) // set JPEG quality
.getBufferAsync(Jimp.MIME_JPEG)
)
.catch(err => err);
}

关于node.js - AWS Lambda 在放置 s3 对象时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55126940/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com