Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 为什么s3.putObject为nodejs缓冲区抛出ERR\u INVALID\u ARG\u类型?_Node.js_Amazon Web Services_Amazon S3_Aws Lambda_Babeljs - Fatal编程技术网

Node.js 为什么s3.putObject为nodejs缓冲区抛出ERR\u INVALID\u ARG\u类型?

Node.js 为什么s3.putObject为nodejs缓冲区抛出ERR\u INVALID\u ARG\u类型?,node.js,amazon-web-services,amazon-s3,aws-lambda,babeljs,Node.js,Amazon Web Services,Amazon S3,Aws Lambda,Babeljs,我正在nodejs中编写一个lambda函数,用于将图像上传到S3存储桶 在我的第一个lambda函数中,我编写了这个内联函数(直接在AWS lambda编辑器中),它工作得非常好。有关守则如下: let decodedImage = Buffer.from(encodedImage, 'base64'); console.log(decodedImage); console.log(typeof decodedImage); console.log(Object.pro

我正在nodejs中编写一个lambda函数,用于将图像上传到S3存储桶

在我的第一个lambda函数中,我编写了这个内联函数(直接在AWS lambda编辑器中),它工作得非常好。有关守则如下:

let decodedImage = Buffer.from(encodedImage, 'base64');
    console.log(decodedImage);
    console.log(typeof decodedImage);
    console.log(Object.prototype.toString.call(decodedImage));

    try {
        await writeToBucket(decodedImage, 'test.png', 'image/png');
    } catch (err) {
        console.log(err);
    } 

async function writeToBucket(data, dbFileId, mimeType) {
    return new Promise((resolve, reject) => {

        var s3 = new AWS.S3();
        const params = {
            Bucket : S3_BUCKET,
            Key : dbFileId,
            Body : data,
            ACL: 'public-read',
            ContentType: mimeType
        }

        s3.putObject(params, function(err, dataString) {
            if (err) {
                reject([503, err]);
            } else {
                resolve();
            }
        });
    });
这三个日志给出:

<Buffer 89 50 4e 47 ... >
object
[object UInt8Array]
就我所能看到的而言,车身的有效载荷确实是缓冲型的,我不知道有什么区别?可能是网页包(或巴贝尔)把事情搞砸了吗?或者它可能与Nodejs.Buffer有关?我在两个lambda中运行Node.js 10.x

我的网页设置如下:

const path = require('path');
require("@babel/register");
require("@babel/plugin-transform-runtime");

const config = {
    mode: 'development',
  entry: './index.js',

  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'index.js',
    library: 'index',
    libraryTarget: 'commonjs2'
  },
  // Loaders
  module: {
    rules : [
      { test: /\.js$/, exclude: /node_modules/, loader: "babel-loader" },
      { test: /\.css$/, use: ['style-loader', 'css-loader']}
    ]
  },
  // Plugins
  plugins: [],
  optimization:{
    minimize: false
  },
  externals: {
    'aws-sdk': 'aws-sdk'
  }
};
// Exports
module.exports = config; 
和package.json依赖项:

"dependencies": {
    "@babel/register": "~7.5.5",
    "@babel/runtime": "~7.5.5",
    "ajv": "~6.10.2",
    "ajv-errors": "~1.0.1",
    "css-loader": "~3.2.0",
    "style-loader": "~1.0.0",
    "uuid": "~3.3.3"
  },
  "devDependencies": {
    "@babel/cli": "~7.5.5",
    "@babel/core": "~7.5.5",
    "@babel/node": "~7.5.5",
    "@babel/plugin-transform-runtime": "~7.5.5",
    "@babel/preset-env": "~7.5.5",
    "aws-sdk": "~2.517.0",
    "babel-loader": "~8.0.6",
    "cross-var-no-babel": "~1.2.0",
    "mocha": "^6.1.4",
    "webpack": "~4.33.0",
    "webpack-cli": "~3.3"
  }

此错误令人困惑,因为您的代码确实使用了
缓冲区
作为
主体
,并且没有任何可见的
参数,因此必须是SDK内部的。孤立地说,假设SDK没有正确处理某些事情,并且抛出异常的时间比预期的要晚得多(例如,不是调用
s3.putObject()
的直接结果,而是在实际“工作”开始之后)

我有一个烦人的想法,我在某个地方读到了关于AWS SDK在试图优化其发行规模时出现的问题。。。但是我找不到我要找的东西,加上你在
外部
中找到了它,所以这可能是无关的

但我确实在AWS SDK for JavaScript开发者指南for SDK v2中发现了一些潜在的相关内容:

通过在配置中将Node.js指定为目标,可以使用webpack生成在Node.js中运行的捆绑包

目标:“节点”

网页文档提到了这一点。这对我来说并不明显,如果这个解释包含一个隐藏的金块来解释为什么不包括它会破坏SDK,或者如果还有其他事情发生。。。但指定这一点似乎是解决办法


如果我要推测的话,我猜这是通过禁用包含
缓冲区
polyfill来实现的,该缓冲区是由webpack添加的。

完全随机猜测,基于。。。
target:“node”
重要吗?事实上,这就是它所需要的一切!!非常感谢您指出这一点,如果您将其作为回复发布,我可以将其标记为解决方案。
"dependencies": {
    "@babel/register": "~7.5.5",
    "@babel/runtime": "~7.5.5",
    "ajv": "~6.10.2",
    "ajv-errors": "~1.0.1",
    "css-loader": "~3.2.0",
    "style-loader": "~1.0.0",
    "uuid": "~3.3.3"
  },
  "devDependencies": {
    "@babel/cli": "~7.5.5",
    "@babel/core": "~7.5.5",
    "@babel/node": "~7.5.5",
    "@babel/plugin-transform-runtime": "~7.5.5",
    "@babel/preset-env": "~7.5.5",
    "aws-sdk": "~2.517.0",
    "babel-loader": "~8.0.6",
    "cross-var-no-babel": "~1.2.0",
    "mocha": "^6.1.4",
    "webpack": "~4.33.0",
    "webpack-cli": "~3.3"
  }