AWS Lambda在放置s3对象时出错

问题描述 投票:1回答:1

我正在开发一个功能,当任何图像上传到存储桶中的images文件夹时,通过在屏幕截图文件夹中保存图像的缩略图版本来创建缩略图。我正在使用无服务器框架。我一直收到如下错误。我已粘贴确切的代码,因此任何人都可以复制粘贴并实施此解决方案。还包括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 }

码:

Handler.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);
}

Serverless.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					
node.js amazon-s3 aws-lambda aws-sdk serverless
1个回答
2
投票

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);
}
© www.soinside.com 2019 - 2024. All rights reserved.