Writing binary data using node.js fs.writeFile to create an image file
I have had the question in question. I solved the problem when I made the default value null of "encoding" in the "request" library
var request = require("request").defaults({ encoding: null });
var fs = require("fs");
fs.writeFile("./image.png", body, function(err) {
if (err) throw err;
});
JavaScript language had no mechanism for reading or manipulating streams of binary data. The
Buffer
class was introduced as part of the Node.js API to make it possible to interact with octet streams in the context of things like TCP streams and file system operations.
Pure JavaScript, while great with Unicode encoded strings, does not handle straight binary data very well.
When writing large amounts of data to a socket it's much more efficient to have that data in binary format vs having to convert from Unicode.
var fs = require('fs');
// string generated by canvas.toDataURL()
var img = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0"
+ "NAAAAKElEQVQ4jWNgYGD4Twzu6FhFFGYYNXDUwGFpIAk2E4dHDRw1cDgaCAASFOffhEIO"
+ "3gAAAABJRU5ErkJggg==";
// strip off the data: url prefix to get just the base64-encoded bytes
var data = img.replace(/^data:image\/\w+;base64,/, "");
var buf = Buffer.from(data, 'base64');
fs.writeFile('image.png', buf, /* callback will go here */);
Reference