Nodejs 'fs' 方法异步运行

Posted

技术标签:

【中文标题】Nodejs \'fs\' 方法异步运行【英文标题】:Nodejs 'fs' methods running asynchronouslyNodejs 'fs' 方法异步运行 【发布时间】:2020-05-13 10:07:06 【问题描述】:

使用 Node.js 中的 fs 包,我得到了一些意想不到的结果,我希望在这里能有所启发。

我有以下代码:

client.on('fileChannel', function(data)
        console.log(data);

        fs.writeFile('/sys/kernel/config/usb_gadget/kvm-gadget/UDC', "", (err) => 
            if (err) console.log(err);
            console.log('UDC Halted');
        );

        fs.readFile('/sys/kernel/config/usb_gadget/kvm-gadget/UDC', (err, data) => 
            if (err) console.log(err);
            console.log(data.toString('utf8'));
        );


        // Attach file to libcomposite
        if (data.Command === "Attach") 

            numAttachedFiles = Object.keys(fileTracker).length;

            lunNum = 'lun.'+numAttachedFiles;
                fileTracker[lunNum] = data.Argument;
                editFile = '/sys/kernel/config/usb_gadget/kvm-gadget/functions/mass_storage.usb/'+lunNum+'/file';
                fs.writeFile(editFile, __dirname+'/uploads/'+data.Argument, (err) => 
                    if (err) console.log(err);
                    console.log('File Attached');
                );
        

        // Reconnect UDC
        fs.readdir('/sys/class/udc', function(err, dirContents) 
            console.log(dirContents);
                if (err) console.log(err);

                fs.writeFile('/sys/kernel/config/usb_gadget/kvm-gadget/UDC', dirContents[0], (err) => 
                    if (err) console.log(err);
                    console.log('UDC Reconnected');
                );
        );

    );

导致(在// 之后调用输入):

 Command: 'Attach', Argument: 'jsmpeg-master.zip'  // console.log(data);
[ 'fe980000.usb' ] // console.log(dirContents);
UDC Halted // console.log('UDC Halted');
File Attached // console.log('File Attached');
[Error: EBUSY: resource busy or locked, write] 
  errno: -16,
  code: 'EBUSY',
  syscall: 'write'
 // fs.writeFile('/sys/kernel/config/usb_gadget/kvm-gadget/UDC'...if (err) console.log(err);
UDC Reconnected // console.log('UDC Reconnected');
fe980000.usb // console.log(data.toString('utf8'));

现在起初我认为这是导致EBUSY 错误的权限问题,但后来我注意到输出的顺序完全不正常。此外,我可以在 shell 中使用 echo(没有 sudo - 我使用 sudo node... 运行 app.js 文件)很好地写入文件。

如果确实发生了什么,为什么一切都可能异步运行?在此先感谢

【问题讨论】:

【参考方案1】:

Node 的 fs writeFile 和 readFile 是异步函数。如果你想要同步函数,你应该使用 fs.writeFileSync 和 fs.readFileSync。

请注意,这意味着您必须删除挂在 writeFile 和 readFile 上的现有回调函数。

您可以在此处阅读 Node.js 文档中同步和非同步功能之间的区别:https://nodejs.org/api/fs.html#fs_fs_readfilesync_path_options

【讨论】:

感谢您的回复,那么我该怎么做来代替已删除的回调函数? @SterlingButters - 响应将从给定函数返回。所以,你可以做类似const fileContents = fs.readFileSync(filename, 'utf-8'); @LMulvey 谢谢 - 我想我现在明白了!我可以使用 try-catch 吗? IE。在不终止进程的情况下打印错误? @LMulvey Nvm,知道了

以上是关于Nodejs 'fs' 方法异步运行的主要内容,如果未能解决你的问题,请参考以下文章

Nodejs 处理异步(获取异步数据并处理)的方法

NodeJS-fs文件系统底层操作

nodeJS之fs文件系统

nodeJS之fs文件系统

nodejs删除安卓手机指定文件

对fs异步读取文件的理解