node.js - node fs.writeFileSync() returnerar aldrig
Jag skapar ett rör och försöker skriva till det. Men skrivandet fungerar aldrig.
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');
Om jag kommenterar allt utom mkfifo.mkfifoSync('/tmp/my_fifo', 0o600); ser jag att röret skapas som det ska.
Men fs.writeFileSync('/tmp/my_fifo', 'Hej där!'); återvänder aldrig.
Även när jag använder callback-versionen `fs.writeFile()1` utlöses callbacken aldrig.
fs.writeFile('/tmp/my_fifo', 'Hey there!', (err) => {
if (err) {
return console.log('Write error: ' + err);
}
console.log('Write success');
process.exit();
});
Återuppringningen anropas aldrig.
Vad gör jag för fel?
Bara som en kontroll öppnade jag och försökte läsa pipen från ett annat skript:
fs.readFile('/tmp/my_fifo', (err, data) => {
if (err) {
return console.log('Read error: ' + err);
}
console.log('Read success. Data is: ' + data);
});
På skribentsidan ser jag felet:
Error: ESPIPE: invalid seek, write
På läsarens sida ser jag:
Read success. Data is:
tom data, men en lyckad läsning.
Uppdatering
Om jag inte skapar röret alls via mkfifoSync(), och istället bara anropar fs.writeFileSync(), kommer det att skapa och skriva till filen utan problem.
Så min fråga är hur skriver jag till detta rör?
Svar #1
du måste använda appendFileSync-metoden, inte writeFileSync-metoden, för att skriva till ett namngivet rör
lägg till i namngivna rör
const fs = require("fs");
const mkfifo = require("mkfifo");
mkfifo.mkfifoSync("/tmp/my_fifo", 0o600);
fs.appendFileSync("/tmp/my_fifo", "hello world", ...);
läsa från namngivna rör
const fs = require("fs");
console.log(fs.readFileSync("/tmp/my_fifo").toString());
