Skip to content

Instantly share code, notes, and snippets.

@leonardonsantos
Last active December 30, 2015 01:18
Show Gist options
  • Save leonardonsantos/7754933 to your computer and use it in GitHub Desktop.
Save leonardonsantos/7754933 to your computer and use it in GitHub Desktop.
#!/usr/bin/nodejs
var levelup = require('levelup');
var http = require("http");
var stream = require('stream');
var util = require('util');
var Transform = stream.Transform || require('readable-stream').Transform;
var server = http.createServer(onRequest);
var db = levelup('db',{"valueEncoding": "json"});
//save something in db
db.put("1",{"leo":1});
db.put("2",{"nardo":2});
db.put("3",{"LEONARDO":3});
var stringifier = new stream.Transform();
stringifier._readableState.objectMode = true;
stringifier._transform = function (data, encoding, done) {
this.push(JSON.stringify(data));
this.push('\n');
done();
}
server.listen(9090, function() { //'listening' listener
console.log("Server has started --- " + (new Date).toJSON());
});
server.on('error', function (e) {
if (e.code == 'EADDRINUSE') {
console.error('Error: address in use');
}
else {
console.error(e + '. Error code: ' + e.code);
}
});
function onRequest(request, response) {
response.setHeader("Content-Type", "application/json; charset=utf-8");
var rs = db.createReadStream();
request.on('close', function(){
rs.destroy();
response.end();
});
rs.on('end', function(){
response.end();
});
rs.on('error', function(err){
console.log('ERROR-RS',err);
rs.destroy();
});
//this way works, but increases memory with large bases, because of event emmiting: http://stackoverflow.com/questions/19550180/memory-leak-when-using-streams-in-node-js
//rs.on('data', function(data){
// response.write(JSON.stringify(data)+"\n");
//});
//This is the way suggested by Paul Mougel
rs.pipe(stringifier).pipe(response);
}
/*
I've got this error:
events.js:72
throw er; // Unhandled 'error' event
^
TypeError: Invalid non-string/buffer chunk
at validChunk (_stream_writable.js:150:14)
at Transform.Writable.write (_stream_writable.js:179:12)
at write (_stream_readable.js:573:24)
at flow (_stream_readable.js:582:7)
at ReadStream.pipeOnReadable (_stream_readable.js:614:5)
at ReadStream.EventEmitter.emit (events.js:92:17)
at emitReadable_ (_stream_readable.js:408:10)
at emitReadable (_stream_readable.js:404:5)
at readableAddChunk (_stream_readable.js:165:9)
at ReadStream.Readable.push (_stream_readable.js:127:10)
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment