stUrb
stUrb

Reputation: 6822

non-blocking way to write to filesystem with node.js

I've written a non-blocking tcp-server with node.js. This server listens on a port and reroutes the request to an other server via a http.request()

To have a back-log of the messages rerouted I want to append every message (single line of information) in a file with the date as filename.

The server is going to be hit by several devices on alternating intervals with small txt strings (800bytes). Writing to the filesystem implicitly calls for a blocking event. Is there a way to prevent this behavior??

Upvotes: 2

Views: 2897

Answers (3)

KGZM
KGZM

Reputation: 414

Something like this might help.

    var fs = require('fs');
    var writer = {
      files: {},
      appendFile: function(path, data) {
        if(this.files[path] === undefined) {
          this.files[path] = {open: false, queue: []};
        }
        this.files[path].queue.push(data);
        if(!this.files[path].open) {
          this.files[path].open = true;
          this.nextWrite(path);
        }
      },
      nextWrite: function(path) {
        var data = this.files[path].queue.shift(),
            self = this;
        if(data === undefined)
          return this.files[path].open = false;
        fs.appendFile(path, data, function(err) {
          if (err) throw err;
          self.nextWrite(path);
        });
      }
    }

It requires version 0.8.0 of node for fs.appendFile, but it keeps a queue per file and then appends the things in the order they were added. It works, but I didn't spent very much time on it.. so use it for educational purposes only.

   writer.appendFile('test.txt','hello');

Upvotes: 0

ControlAltDel
ControlAltDel

Reputation: 35011

If appendFile doesn't work out right, I have myself tested a solution for this using File streams that works with multiple clusters and won't clobber the output

Upvotes: 3

JohnnyHK
JohnnyHK

Reputation: 311835

Just use the asynchronous methods of the fs module like appendFile.

http://nodejs.org/api/fs.html#fs_fs_appendfile_filename_data_encoding_utf8_callback

Upvotes: 1

Related Questions