Simple file writer with atomic writing and race condition prevention.
Can be used as a drop-in replacement to fs.writeFile()
.
Built on graceful-fs and used in lowdb.
npm install steno --save
const steno = require('steno')
steno.writeFile('file.json', data, err => {
if (err) throw err
})
Let's say you have a server and want to save data to disk:
var data = { counter: 0 }
server.post('/', (req, res) => {
// Increment counter
++data.counter
// Save data asynchronously
fs.writeFile('data.json', JSON.stringify(data), err => {
if (err) throw err
res.end()
})
})
Now if you have many requests, for example 1000
, there's a risk that you end up with:
// In your server
data.counter === 1000
// In data.json
data.counter === 865 // ... or any other value
Why? Because, fs.write
doesn't guarantee that the call order will be kept. Also, if the server is killed while data.json
is being written, the file can get corrupted.
server.post('/increment', (req, res) => {
++data.counter
steno.writeFile('data.json', JSON.stringify(data), err => {
if (err) throw err
res.end()
})
})
With steno you'll always have the same data in your server and file. And in case of a crash, file integrity will be preserved.
if needed, you can also use steno.writeFileSync()
which offers atomic writing too.
Important: works only in a single instance of Node.
MIT - Typicode