节点 fs.writeFileSync() 永远不会返回

Posted

技术标签:

【中文标题】节点 fs.writeFileSync() 永远不会返回【英文标题】:node fs.writeFileSync() never returns 【发布时间】:2018-08-01 17:58:30 【问题描述】:

我正在创建一个管道并尝试写入它。但写作永远不会奏效。

import * as fs from 'fs';
import * as mkfifo from 'mkfifo';

mkfifo.mkfifoSync('/tmp/my_fifo', 0o600);

fs.writeFileSync('/tmp/my_fifo', 'Hey there!');

console.log('here');

如果我评论除mkfifo.mkfifoSync('/tmp/my_fifo', 0o600); 之外的所有内容,我会看到管道创建正常。

但是,fs.writeFileSync('/tmp/my_fifo', 'Hey there!'); 永远不会返回。

即使我使用回调版本 `fs.writeFile()1,回调也不会被触发。

fs.writeFile('/tmp/my_fifo', 'Hey there!', (err) => 
    if (err) 
        return console.log('Write error: ' + err);
    

    console.log('Write success');

    process.exit();
);

永远不会调用回调。

我做错了什么?

作为一个检查,我打开并尝试从另一个脚本中读取管道:

fs.readFile('/tmp/my_fifo', (err, data) => 
    if (err) 
        return console.log('Read error: ' + err);
    

    console.log('Read success. Data is: ' + data);
);

在作者方面,我看到了错误:

Error: ESPIPE: invalid seek, write

在读者方面我看到了:

Read success. Data is: 

空数据,但读取成功。

更新

如果我根本不通过mkfifoSync() 创建管道,而只是调用fs.writeFileSync(),它将创建并写入文件就好了。

所以我的问题是如何写入这个管道?

【问题讨论】:

【参考方案1】:

您必须使用appendFileSync 方法而不是writeFileSync 方法来写入命名管道

附加到命名管道

const fs = require("fs");
const mkfifo = require("mkfifo");

mkfifo.mkfifoSync("/tmp/my_fifo", 0o600);
fs.appendFileSync("/tmp/my_fifo", "hello world", ...);

从命名管道读取

const fs = require("fs");
console.log(fs.readFileSync("/tmp/my_fifo").toString());

【讨论】:

我实际上使用npmjs.com/package/mkfifo 创建fifo 和 fs.appendFileSync("/tmp/my_fifo", "hello world", ...);有同样的问题......它只是挂起。 从命名管道读取是一个单独的脚本,写入命名管道也是一个单独的脚本,你必须在读取部分之前执行写入部分 @lostdorje 你把相同的代码 sn-p 放在一个文件里了吗? 我有 2 个脚本。写作的只是挂起。 (不过应该没关系——写入和读取可以在单个脚本中完成,因为正在使用所有方法的“*同步”版本)。当我删除 mkfifo.mkfifoSync("/tmp/my_fifo", 0o600);一切正常,除了它不是管道,它是一个常规文件。 哈!谢谢你的证明。我需要那个。我不知道。我注意到您的代码和我的代码之间存在一些小的差异,并且直接复制了您的代码并且它起作用了。然后我开始将它逐个改回我的原始代码,果然它仍然有效!它停止工作的地方是从 appendFileSync() 切换到 writeFileSync()。这就是你所说的开始。这是我为使我的东西正常工作所做的第一个更改,但它没有......但是当我使用您的代码示例并将其备份到我的代码中时,一切都开始工作了。德普。谢谢! :-)

以上是关于节点 fs.writeFileSync() 永远不会返回的主要内容,如果未能解决你的问题,请参考以下文章

完成 fs.writeFilesync 时的回调

fs.writeFileSync 不能在这里设置 DOCTYPE

fs.writeFileSync 给出错误:未知,在 nodejs 中进行同步文件写入的正确方法

Nodemon fs.writeFileSync 崩溃

nodejs写文件

[Node.js] Write or Append to a File in Node.js with fs.writeFile and fs.writeFileSync