Node.js 为什么s3.putObject为nodejs缓冲区抛出ERR\u INVALID\u ARG\u类型?
我正在nodejs中编写一个lambda函数,用于将图像上传到S3存储桶 在我的第一个lambda函数中,我编写了这个内联函数(直接在AWS lambda编辑器中),它工作得非常好。有关守则如下: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
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"
}