Nodo js exportar json como archivo

Mi servidor de nodo está generando un objeto / matriz json. Necesito enviarlo al usuario, pero no para mostrarlo en el navegador, sino como un archivo. ¿Cómo lo hago?

No creo que escribirlo en un archivo y luego usar res.sendFile() sea ​​lo correcto.

Solo necesita agregar el encabezado Content-Type como algo que el navegador no usará para mostrarlo directamente, luego el contenido se descargará como archivo adjunto.

Si desea asignar un nombre al archivo de descarga, deberá usar el encabezado Content-Disposition .

El objeto JSON puede simplemente convertirse en cadena y enviarse con los dos encabezados anteriores.

A continuación se muestra el código de servidor de trabajo.

 http = require('http'); server = http.createServer( function(req, res) { /**************** This is the important part **************/ res.writeHead(200, { 'Content-Type': 'application/json-my-attachment', "content-disposition": "attachment; filename=\"my json file.json\"" }); var jsonObj = {"name":"Will McAvoy"}; res.end(JSON.stringify(jsonObj)); }); port = 3000; host = '127.0.0.1'; server.listen(port, host); console.log('Listening at http://' + host + ':' + port); 

application/json-my-attachment es un nombre de Content-Type creado, ya que el navegador no lo reconoce, intentará descargarlo. De lo contrario, también puede agregar encabezado estándar Content-Type: application/octet-stream .

Editar

Con respecto a su segunda pregunta, cómo enviar parámetros en la solicitud POST al descargar un archivo, se puede hacer fácilmente utilizando el HTML Form .

Mientras utiliza AngularJS , supongo que no desea que su página se actualice al enviar el formulario. Esto se puede hacer utilizando un IFrame . Simplemente actualice el atributo src de IFrame con Javascript a la ruta de descarga del archivo.

Soluciona el problema de actualización de la página, pero no podemos enviar solicitudes POST with body utilizando solo un IFrame.

Aquí tenemos que usar una combination of Form and IFrame . HTML Form tiene un atributo de target en el que podemos especificar el nombre de un IFrame. El formulario puede especificar los parámetros del formulario, la acción y el método HTTP a utilizar. Como el objective es un IFrame, no actualizará la página actual.

Nota: la limitación de este método es que no puede enviar encabezados HTTP con el envío del formulario, aunque hay algunos hacks disponibles .

A continuación se muestra el código de trabajo. He utilizado Expressjs como el servidor de nodo.

HTML

    

Javascript

 $(function () { $("#downloadFile").click(function () { var form = $("#downloadForm"); form.find("[name=param1]").val("hello"); form.find("[name=param2]").val("world"); form.submit(); }); }); 

Instalación NPM

 npm install express npm install body-parser 

Servidor de nodo

 var express = require('express'); var bodyParser = require('body-parser'); var path = require('path'); var fs = require('fs'); app = express(), app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: false })); port = process.env.PORT || 3000; app.all("/*", function (req, res) { if(req.method = "POST" && req.url === "/download") { /**************** This is the important part **************/ res.writeHead(200, { 'Content-Type': 'application/json-my-attachment', "content-disposition": "attachment; filename=\"my json file.json\"" }); console.log("body : " + JSON.stringify(req.body)); var jsonObj = {"name":"Will McAvoy"}; res.end(JSON.stringify(jsonObj)); } else { var filePath = req.url; filePath = (filePath === "/") ? "index.html" : filePath; filePath = path.join(__dirname, "public", filePath); console.log(filePath); fs.stat(filePath, function (err, stat) { if(!err) { res.sendFile(filePath); } else { res.writeHead(404); res.end("file not found"); } }); } }); console.log("server started at : http://localhost:" + port); app.listen(port); 

** Salida del servidor al hacer clic en el botón de descarga **

el servidor comenzó en: http: // localhost: 3000
body: {“param1”: “hello”, “param2”: “world”}