将嵌套json对象转换为Multer的formdata javascript



以前我是通过post发送我的Javascript对象到节点后端。工作正常。问题是我必须移动到表单数据,因为我在我们的json更改头像为s3 url而不是base64。所以我安装了multer和multer-s3。我无法上传头像或更新其他Javascript对象属性。

我的Javascript对象的结构与

相同
{
info: {
name: 'abc',
avatar: Blob Instance
},
address: {},
education: {}
}

乘数代码是

const multer = require('multer');
const aws = require('aws-sdk');
const BUCKET_NAME = 'myBucket';
var multerS3 = require('multer-s3');
aws.config.accessKeyId = 'someId';
aws.config.secretAccessKey = 'someKey';
aws.config.region = 'us-east-2';
var upload = multer({
storage: multerS3({
s3: new aws.S3(),
bucket: BUCKET_NAME,
acl: 'public-read',
contentType: multerS3.AUTO_CONTENT_TYPE,
metadata: function(req, file, cb) {
console.log(file);
cb(null, { fieldName: file.fieldname });
},
key: function(req, file, cb) {
let id = req.user._id;
cb(null, id + '/' + Date.now().toString() + '_' + file.originalname);
},
}),
});

我的路线是

router.post(
'/',
authorizeUser,
upload.single('avatar'),
controller.updateWithAsscociations
);

在我的控制器函数updatewithassociations我什么也没得到。既不是logoURL也不是rest

看起来您只需要稍微改变一下请求结构,并将头像图像表单字段与文本字段一起发送。比如:

curl --request POST 'http://localhost:3000/test-upload' 
--form 'info[name]="someName"' 
--form 'address[street]="someStreet"' 
--form 'address[number]="123"' 
--form 'avatar=@"/path/to/your/image"'
下面是在nodejs端访问数据的方法:
const multer = require('multer');
const upload = multer({dest: 'uploads/'})

app.post('/test-upload', upload.single('avatar'), (req, res, next) => {
// req.file is the `avatar` file
// req.body will hold the text fields (converted to an object)
console.log("avatar file is", req.file);
console.log("body is", JSON.stringify(req.body));
res.status(201).end();
})

所以当执行"test-upload"以下请求将被记录到控制台:

avatar file is {
fieldname: 'avatar',
originalname: '<name-of-file>',
...
destination: 'uploads/',
path: 'uploads\2d907155c413320252e8fce04c266840',
size: 477
}
body is {"info":{"name":"someName"},"address":{"street":"someStreet","number":"123"}}

最新更新