Node.js 问题理解异步等待节点.js计时

Node.js 问题理解异步等待节点.js计时,node.js,reactjs,express,Node.js,Reactjs,Express,我的异步等待计时有问题,因为我的代码正在接受来自react前端的文件,然后它根据react的信息创建一个文件夹,然后在创建文件夹后,它将文件重命名为刚刚创建的正确文件夹 在我的日志中,我看到有时文件在创建文件夹之前被重命名,从我读到的所有内容来看,第一次等待需要在顺序中的下一次等待开始之前完成,但我的代码似乎没有发生这种情况。下面显示了我的代码以及显示文件夹创建前文件重命名尝试的日志 newhireRouter.post('/',forgired(),async(req,res)=>{ cons

我的异步等待计时有问题,因为我的代码正在接受来自react前端的文件,然后它根据react的信息创建一个文件夹,然后在创建文件夹后,它将文件重命名为刚刚创建的正确文件夹

在我的日志中,我看到有时文件在创建文件夹之前被重命名,从我读到的所有内容来看,第一次等待需要在顺序中的下一次等待开始之前完成,但我的代码似乎没有发生这种情况。下面显示了我的代码以及显示文件夹创建前文件重命名尝试的日志

newhireRouter.post('/',forgired(),async(req,res)=>{
const{firstName、middleName、dm_userFirst、dm_userLast、dm_email、firstLast、firstDay、dob、位置、雇佣类型、地址、电子邮件、secondLast、电话、电话2、性别、天数、工资、职位、小时数、语言、ssn、数字}=req字段;
const{file1,file2,file3}=req.files;
const receiver=wait DepartmentModel.findOne({部门:'新员工'});
试一试{
等待fs.mkdir(`.././uploads/images/newhires/${firstName}${firstLast}`,{recursive:true},(err)=>{
如果(错误){
控制台日志(err);
}
log('Folder created successfully!');
})
等待fs.rename(file1.path,`.././uploads/images/newhires/${firstName}${firstLast}/${file1.name}`,(err)=>{
如果(错误){
log('文件无法移动!');
}
})
等待fs.rename(file2.path,`.././uploads/images/newhires/${firstName}${firstLast}/${file2.name}`,(err)=>{
如果(错误){
log('文件无法移动!');
}
})
等待fs.rename(file3.path,`.././uploads/images/newhires/${firstName}${firstLast}/${file3.name}`,(err)=>{
如果(错误){
log('文件无法移动!');
}
})
}捕捉(错误){
控制台日志(err);
}
}
日志:

无法移动
0 |服务器|文件!
无法移动0 |服务器|文件!
无法移动0 |服务器|文件!
0 |服务器|文件夹创建成功!
0 |服务器| POST/api/newhire 200 651.450 ms-16
0 | server |[错误:enoint:没有这样的文件或目录,请打开“../../uploads/images/newhires/Tester Testing/12335_TK.PNG”]{
0 |服务器|错误号:-2,
0 |服务器|代码:“ESTREAM”,
0 |服务器|系统调用:“打开”,
0 |服务器|路径:'../../uploads/images/newhires/Tester Testing/12335_TK.PNG',
0 |服务器|命令:“API”
0 |服务器|}

您需要将fs与Promise一起使用

fs.promises API提供了一组异步文件系统方法,这些方法返回Promise对象而不是使用回调。可以通过require('fs').promises访问该API

async/await是JavaScript Promise的一个糖类应用程序,在这种情况下,您需要使用它来获得预期的结果

await fs.promises.mkdir(`../../uploads/images/newhires/${firstName} ${firstLast}`, { recursive: true });
console.log('Folder created successfully!');
在您的代码中,您正在使用回调,并期望使用wait获得承诺(已解决| |拒绝)

await fs.mkdir(
`../../uploads/images/newhires/${firstName} ${firstLast}`,
{ recursive: true },
 /* (err) => {
        if (err) {
            console.log(err);
        }
        console.log('Folder created successfully!');
    } */
) // The above comment is a Callback code!

async/await
与承诺一起工作。您只能等待承诺。因此,为了让您在
fs.mkdir
上等待,它应该返回一个与您的代码不同的承诺。您正在使用回调API。有多种方法可以解决此问题

您可以使用promisify from util将任何回调函数转换为其对应的promise函数

const util = require('util');
const fs = require('fs');

const mkdir = util.promisify(fs.mkdir);
await mkdir(`../../uploads/images/newhires/${firstName} ${firstLast}`,{ recursive: true })

解决此问题的另一种方法是使用promise fs API而不是回调

const fs = require('fs');
const fsPromises = fs.promises;
await fsPromises.mkdir(`../../uploads/images/newhires/${firstName} ${firstLast}`,{ recursive: true })

这正是我所需要的。非常感谢你!这正是我所需要的和有意义的。谢谢!嗨@ jsaEpPi,不客气!如果这个或任何答案已经解决了你的问题,请点击检查标记。这向更广泛的社区表明你已经找到了解决方案并给两个ANS带来了一些声望。沃勒和你自己,没有义务这么做。