第一个参数必须是字符串类型或 Buffer、ArrayBuffer 或 Array 或类数组对象的实例。收到未定义

The first argument must be of type string or an instance of Buffer, ArrayBuffer, or Array or an Array-like Object. Received undefined

我正在尝试通过触发来自 Postman 的请求使用用 NodeJS 编写的 Lambda 函数上传文件 (pdf/jpg),但我收到以下错误:-

2022-02-02T15:09:51.135Z    743939db-7511-4003-8e49-40c95ada47b4    ERROR   Invoke Error    
{
    "errorType": "TypeError",
    "errorMessage": "The first argument must be of type string or an instance of Buffer, ArrayBuffer, or Array or an Array-like Object. Received undefined",
    "code": "ERR_INVALID_ARG_TYPE",
    "stack": [
        "TypeError [ERR_INVALID_ARG_TYPE]: The first argument must be of type string or an instance of Buffer, ArrayBuffer, or Array or an Array-like Object. Received undefined",
        "    at new NodeError (internal/errors.js:322:7)",
        "    at Function.from (buffer.js:334:9)",
        "    at Runtime.exports.lambdaHandler [as handler] (/var/task/app.js:68:23)"
    ]
}

以下是 CloudWatch 上记录的事件对象块:-

2022-02-02T20:39:52.136+05:30

Copy
info: Event:: {"body":"{\n    \"base64String\": \"/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAcHBwcIBwgJCQgMDAsMDBEQDg4QERoSFBIUEhonGB0YGB0YJyMqIiAiKiM+MSsrMT5IPDk8SFdOTldtaG2Pj8ABBwcHBwgHCAkJCAwMCwwMERAODhARGhIUEhQSGicYHRgYHRgnIyoiICIqIz4xKysxPkg8OTxIV05OV21obY+PwP/CABEICHAPAAMBIgACEQEDEQH/xAAcAAEAAgMBAQEAAAAAAAAAAAAABwgBBQYEAwL/2gAIAQEAAAAAsiAA

Lambda(NodeJS 代码):-

'use-strict'

const AWS = require("aws-sdk");

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

const moment = require('moment');

const fileType = ('file-type');

const { Buffer } = require('buffer');

//const { fileTypeFromFile } = 'file-type';

const ddbTable = process.env.RUNTIME_DDB_TABLE_FREE_USER_DOCUMENT;

const s3TempBucket = process.env.RUNTIME_S3_TEMP_BUCKET;

const s3 = new AWS.S3();

const getFile = (fileMime, buffer, userId) => {
  let fileExt = fileMime.ext;
  let hash = sha1(new Buffer(new Date().toString()));
  let now = moment().format('YYYY-MM-DD HH:mm:ss');

  let filePath = hash + '/';
  let fileName = unixTime(now) + '.' + fileExt;
  let fileFullName = filePath + fileName;
  let fileFullPath = s3TempBucket + userId + fileFullName;

  const params = {
    Body: buffer,
    Bucket: s3TempBucket,
    Key: fileName
  };

  let uploadFile = {
    size: buffer.toString('ascii').length,
    type: fileMime.mime,
    name: fileName,
    fullPath: fileFullPath
  }

  return {
    'params': params,
    'uploadFile': uploadFile
  }
}

exports.lambdaHandler = async (event, context) => {
  logger.info("Event::", event);
  logger.info('Uploading file to bucket::', s3TempBucket);

  let body, data;
  let statusCode = 200;
  const headers = {
    'Content-Type': 'application/json',
    'Access-Control-Allow-Headers': 'Content-Type',
    'Access-Control-Allow-Origin': '*',
    'Access-Control-Allow-Methods': '*'
  };

  let request = JSON.parse(event.body);
  let base64String = await request.base64String;
  logger.info("base64String::", base64String);

  let buffer = Buffer.from(base64String, 'base64');

  //let buffer = new Buffer(base64String, 'base64');
  let fileMime = fileType(buffer);
  logger.info(fileMime);

  if (fileMime === null) {
    return context.fail('String supplied is not file type');
  }

  //let file = getFile(fileMime, buffer, user.id);
  let file = getFile(fileMime, buffer, 'b06eb6f4-0ff0-5cb5-a41c-e000af66c8e9');
  let params = file.params;

  try {
    //await new Promise((resolve, reject) => {
      s3.putObject(params, (err, results) => {
        if (err) reject(err);
        else {
          console.log(results);
          body = results;
          resolve(results)
        }
      });
   // });

  } catch (err) {
    logger.info(err);
    statusCode = 400;
    body = err.message;
    return err;
  } finally {
    body = JSON.stringify(data);
  }

  return {
    statusCode,
    body,
    headers
  };

}

base64String 未定义,不确定为什么,正如我在事件对象中清楚看到的那样?:-

let buffer = Buffer.from(base64String, 'base64');

请帮忙,谢谢

邮递员要求:-

如果您使用 API 网关,您不需要 base64 编码,因为 API 网关会自动

AWS 中提供了示例。

  1. Select 创建函数
  2. Select 浏览无服务器应用存储库
  3. 找到“uploader:用于将文件上传到的无服务器网络应用程序 S3
  4. 部署

uploader's github

这将创建 API 网关和 NodeJS Lambda。 (您需要提供 S3 存储桶。)

说明说要上传文件,请在浏览器中打开 InvokeURL 并拖放文件。您也可以使用 Postman 执行此操作,如下所示。

  1. 输入POST InvokeURL/api/file/text.pdf.
  2. 设置body KEY为File,输入text.pdf。 Select pdf 文件作为 VALUE。
  3. 发送

您可以在index.js中找到代码并提取您需要的内容。