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' 方法异步运行的主要内容,如果未能解决你的问题,请参考以下文章