【问题标题】: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 文件)很好地写入文件。

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

【问题讨论】:

    标签: node.js asynchronous fs read-write


    【解决方案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,知道了
    猜你喜欢
    • 2015-02-25
    • 1970-01-01
    • 2021-04-15
    • 1970-01-01
    • 2016-12-02
    • 2014-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多