[英]Async await not working properly in function call with callbacks
我是node.js
的新手。我正在使用 await/async 来避免函数在完成前一个函数之前运行。首先是代码。
---------------first-----------
exports.createProfileUser = async (req, res, next) => {
const {user_image,image_two,
image_three,image_four,
image_five} = req.files
try{
var filetype = req.files.user_image.name.split(".");
var newFileName = "./public/images/"+Date.now()
+ Math.floor(100000 + Math.random() * 900000)
+ "."+filetype[1]
await insertImages(req,newFileName)
await createProfile(req,res,newFileName.substring(1), (result) =>{
if(result){
return res.json(result)
}
else{
return res.json({
status:false,
message:'Error Occurred '
})
}
})
. then((result) => {
if(result){
return res.json(result)
}
else{
return res.json({
status:false,
message:'Error Occurred '
})
}
})
}
catch(error){
res.sendStatus(500) && next(error)
}};
在上面的代码中,我希望insertImages
函数在调用createProfile
之前完全完成。但这并没有发生。这是insertImages
代码。
--------------two--------------
insertImages = (req,baseFileName) =>{
const {user_id} = req.fields
var newFileNameTemp = baseFileName.substr(1);
if(image){
let fileType = req.files.image_five.name.split(".")
let name = "./public/images/"+Date.now() + "." + fileType[1]
let tempName = name.substr(1);
fs.copyFile(req.files.image_five.path,
name,
async(err) => {
if (err) {
console.log("Error in copying file",err)
return res.json({
status:false,
message:"Error occurred while updating Profile Pic Two of the user ",
})
}
await makeGallery(user_id,tempName, (resultId)=>{
console.log('resultId,',resultId)
})
});
}
}
复制文件后,我将一个对象保存在gallery
架构中,然后获取其_id
并将其更新给users
架构。代码是。
--------------threee----------------
makeGallery = async (user_id,imageName,callback) => {
var g = new Gallery();
g.image = imageName
var saved = await g.save()
.then( async (gallery) => {
await Users.findOneAndUpdate({user_id: user_id},{$push: {gallery:[gallery._id]}},
{ upsert: true }
)
.then(async(data) =>{
await console.log("Successfully added");
})
await callback(gallery._id)
})
.catch(err => {
return {
status:false,
message:err.message,
}
});
}
我已经使用 await 所以函数会等到数据更新。 但这并没有达到我的预期。 createProfile
函数在insertImages
完成之前被调用。我在这里做错了什么?请更正我的代码,我被困在这个问题上。提前致谢。
主要是你没有与异步的fs.copyFile
同步
>>> insertImages = async (req,baseFileName) => {
const {user_id} = req.fields
var newFileNameTemp = baseFileName.substr(1);
if(image){
let fileType = req.files.image_five.name.split(".")
let name = "./public/images/"+Date.now() + "." + fileType[1]
let tempName = name.substr(1);
>>> await new Promise(function(resolve, reject){
>>> return fs.copyFile(req.files.image_five.path, name, err => {
if (err) {
console.log("Error in copying file",err)
// you should return the response server elsewhere. NOT in insertImages..
// you should throw a proper error as well
>>> return reject(res.json({
status:false, // should be 500 for internal server error
message:"Error occurred while updating Profile Pic Two of the user ",
}))
}
>>> return resolve()
})
})
}
await makeGallery(user_id,tempName, (resultId)=>{
console.log('resultId,',resultId)
})
}
最终,您可以使用
const copyFile = require('util').promisify(fs.copyFile)
所以你可以直接写
>>> insertImages = async (req,baseFileName) => {
const {user_id} = req.fields
var newFileNameTemp = baseFileName.substr(1);
if(image){
let fileType = req.files.image_five.name.split(".")
let name = "./public/images/"+Date.now() + "." + fileType[1]
let tempName = name.substr(1);
>>> await copyFile(req.files.image_five.path, name).catch(err => {
console.log("Error in copying file",err)
>>> throw res.json({
status:false,
message:"Error occurred while updating Profile Pic Two of the user ",
})
})
}
await makeGallery(user_id,tempName, (resultId)=>{
console.log('resultId,',resultId)
})
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.