Node.js 在s3映射问题中使用节点上载多个图像
我正在努力寻找将两个文件上传到s3的解决方案。我可以用multer上传一个文件,我已经学会了如何上传,但是当我试图在formdata中的所有文件中绘制一个地图并上传每个文件时,我会将每个位置的URL(我保存在数据库中的URL)放入一个数组中。然后,我尝试打印每个url,但令我惊讶的是,它们打印在if语句中,而不是当我将其保存在if之外的数据库中时。可能是因为一个不同步的问题吗?。 谢谢Node.js 在s3映射问题中使用节点上载多个图像,node.js,amazon-s3,Node.js,Amazon S3,我正在努力寻找将两个文件上传到s3的解决方案。我可以用multer上传一个文件,我已经学会了如何上传,但是当我试图在formdata中的所有文件中绘制一个地图并上传每个文件时,我会将每个位置的URL(我保存在数据库中的URL)放入一个数组中。然后,我尝试打印每个url,但令我惊讶的是,它们打印在if语句中,而不是当我将其保存在if之外的数据库中时。可能是因为一个不同步的问题吗?。 谢谢 如果您查看文档,因为它不会返回承诺,所以您不应该打电话等待。默认映射方法与此表单中的异步代码不兼容。您需要使用
如果您查看文档,因为它不会返回承诺,所以您不应该打电话等待。默认映射方法与此表单中的异步代码不兼容。您需要使用异步代码,或者将其包装在承诺中,如
return await new Promise((resolve, reject) => {
...
if (data) {
fs.unlinkSync(item.path);
resolve(data.location);
}
}
您的其他代码也有一些问题。map函数应该返回一个值。如果您不想返回任何内容,则应使用foreach。我已尝试解决此问题,但无法解决:( 这是我的新代码
tournamentsCtrl.createTournament = async (req, res) => {
aws.config.setPromisesDependency();
aws.config.update({
accessKeyId: process.env.AWS_ACCESS_KEY_ID,
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
//region: process.env.REGION
});
const s3 = new aws.S3();
var files_upload = {};
let promiseList = new Promise(function (resolve, reject) {
req.files.forEach(element => {
if (element.fieldname.includes('img')) {
var folder = 'club_images'
} else if (element.fieldname.inlcudes('poster')) {
var folder = 'poster_tournament'
} else {
var folder = 'info_tournament'
}
var params = {
ACL: 'public-read',
Bucket: process.env.AWS_BUCKET_NAME,
Body: fs.createReadStream(element.path),
Key: `${folder + '/' + uuidv4() + element.fieldname}`
};
s3.upload(params, (err, data) => {
if (err) {
console.log('Error occured while trying to upload to S3 bucket', err);
}
if (data) {
fs.unlinkSync(element.path); // Empty temp folder
const locationUrl = data.Location;
files_upload[element.fieldname] = locationUrl;
console.log(files_upload);
}
});
});
resolve(files_upload)
})
Promise.all([promiseList]).then(() => {
console.log(Object.assign(JSON.parse(req.body.values), files_upload));
const newUser = new Tournaments(Object.assign(JSON.parse(req.body.values), files_upload));
console.log(newUser)
newUser
.save()
.then(user => {
res.json({ message: 'User created successfully', user });
})
.catch(err => {
console.log('Error occured while trying to save to DB');
});
})
};
这是一个询问代码建议的不好的地方,但类似于以下内容
function uploadFile(s3, element) {
return new Promise((resolve, reject) => {
let folder;
if (element.fieldname.includes('img')) {
folder = 'club_images'
} else if (element.fieldname.inlcudes('poster')) {
folder = 'poster_tournament'
} else {
folder = 'info_tournament'
}
const params = {
ACL: 'public-read',
Bucket: process.env.AWS_BUCKET_NAME,
Body: fs.createReadStream(element.path),
Key: `${folder + '/' + uuidv4() + element.fieldname}`
};
s3.upload(params, (err, data) => {
if (err) {
return reject(err);
}
if (data) {
return fs.unlink(element.path, err=> {
if(err) {
console.error("Failed to unlink file", element.path);
}
return resolve({[element.fieldname]: data.Location});
}); // Empty temp folder
}
return resolve();
});
})
}
tournamentsCtrl.createTournament = async (req, res) => {
aws.config.setPromisesDependency();
aws.config.update({
accessKeyId: process.env.AWS_ACCESS_KEY_ID,
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
//region: process.env.REGION
});
const s3 = new aws.S3();
try {
const uploadData = await Promise.all(req.files.map(element => uploadFile(s3, element)));
const returnData = Object.assign({}, ...uploadData);
console.log(Object.assign(JSON.parse(req.body.values), returnData));
} catch(e) {
console.error('Failed to upload file', e);
return res.sendStatus(500);
}
const newUser = new Tournaments(Object.assign(JSON.parse(req.body.values), files_upload));
console.log(newUser)
try {
const user = await newUser.save()
res.json({message: 'User created successfully', user});
} catch(e) {
console.error('Error occured while trying to save to DB');
return res.sendStatus(500);
}
};
谢谢你的回答。我试图解决它,但这是不可能的。你能帮我吗?谢谢。
function uploadFile(s3, element) {
return new Promise((resolve, reject) => {
let folder;
if (element.fieldname.includes('img')) {
folder = 'club_images'
} else if (element.fieldname.inlcudes('poster')) {
folder = 'poster_tournament'
} else {
folder = 'info_tournament'
}
const params = {
ACL: 'public-read',
Bucket: process.env.AWS_BUCKET_NAME,
Body: fs.createReadStream(element.path),
Key: `${folder + '/' + uuidv4() + element.fieldname}`
};
s3.upload(params, (err, data) => {
if (err) {
return reject(err);
}
if (data) {
return fs.unlink(element.path, err=> {
if(err) {
console.error("Failed to unlink file", element.path);
}
return resolve({[element.fieldname]: data.Location});
}); // Empty temp folder
}
return resolve();
});
})
}
tournamentsCtrl.createTournament = async (req, res) => {
aws.config.setPromisesDependency();
aws.config.update({
accessKeyId: process.env.AWS_ACCESS_KEY_ID,
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
//region: process.env.REGION
});
const s3 = new aws.S3();
try {
const uploadData = await Promise.all(req.files.map(element => uploadFile(s3, element)));
const returnData = Object.assign({}, ...uploadData);
console.log(Object.assign(JSON.parse(req.body.values), returnData));
} catch(e) {
console.error('Failed to upload file', e);
return res.sendStatus(500);
}
const newUser = new Tournaments(Object.assign(JSON.parse(req.body.values), files_upload));
console.log(newUser)
try {
const user = await newUser.save()
res.json({message: 'User created successfully', user});
} catch(e) {
console.error('Error occured while trying to save to DB');
return res.sendStatus(500);
}
};