leer - mostrar datos json javascript
Manera adecuada de devolver JSON usando node o Express (5)
Dado que Express.js 3x, el objeto de respuesta tiene un método json () que establece todos los encabezados correctamente para usted y devuelve la respuesta en formato JSON.
Ejemplo:
res.json({"foo": "bar"});
Entonces, uno puede intentar obtener el siguiente objeto JSON:
$ curl -i -X GET http://echo.jsontest.com/key/value/anotherKey/anotherValue
HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
Content-Type: application/json; charset=ISO-8859-1
Date: Wed, 30 Oct 2013 22:19:10 GMT
Server: Google Frontend
Cache-Control: private
Alternate-Protocol: 80:quic,80:quic
Transfer-Encoding: chunked
{
"anotherKey": "anotherValue",
"key": "value"
}
$
¿Hay una manera de producir exactamente el mismo cuerpo en una respuesta de un servidor usando node o express? Claramente, uno puede establecer los encabezados e indicar que el tipo de contenido de la respuesta será "application / json", pero luego hay diferentes formas de escribir / enviar el objeto. El que he visto que se usa comúnmente es mediante un comando del formulario:
response.write(JSON.stringify(anObject));
Sin embargo, esto tiene dos puntos donde se podría argumentar como si fueran "problemas":
- Estamos enviando una cadena.
- Además, no hay un nuevo carácter de línea al final.
Otra idea es usar el comando:
response.send(anObject);
Esto parece estar enviando un objeto JSON basado en la salida de curl similar al primer ejemplo anterior. Sin embargo, no hay un nuevo carácter de línea en el extremo del cuerpo cuando el rizo se está utilizando de nuevo en un terminal. Entonces, ¿cómo puede uno realmente escribir algo como esto con una nueva línea de caracteres agregada al final usando node o node / express?
Esa respuesta también es una cadena, si desea enviar la respuesta prettified, por alguna extraña razón, podría usar algo como JSON.stringify(anObject, null, 3)
Es importante que también establezca el encabezado Content-Type
en application/json
.
var http = require(''http'');
var app = http.createServer(function(req,res){
res.setHeader(''Content-Type'', ''application/json'');
res.send(JSON.stringify({ a: 1 }));
});
app.listen(3000);
// > {"a":1}
Prettified:
var http = require(''http'');
var app = http.createServer(function(req,res){
res.setHeader(''Content-Type'', ''application/json'');
res.send(JSON.stringify({ a: 1 }, null, 3));
});
app.listen(3000);
// > {
// > "a": 1
// > }
No estoy exactamente seguro de por qué quiere terminarlo con una nueva línea, pero podría simplemente hacer JSON.stringify(...) + ''/n''
para lograrlo.
Exprimir
En express puedes hacerlo cambiando las opciones en su lugar .
''json replacer''
llamada del sustituto JSON''json replacer''
, nula de forma predeterminada
''json spaces''
respuesta JSON de''json spaces''
para el formateo, por defecto a 2 en desarrollo, 0 en producción
En realidad no se recomienda establecer en 40
app.set(''json spaces'', 40);
Entonces podrías simplemente responder con algún json.
res.json({ a: 1 });
Utilizará la configuración de '' ''json spaces
'' para pretenderlo.
Puede usar un middleware para establecer el tipo de contenido predeterminado y establecer el tipo de contenido de manera diferente para las API particulares. Aquí hay un ejemplo:
const express = require(''express'');
const app = express();
const port = process.env.PORT || 3000;
const server = app.listen(port);
server.timeout = 1000 * 60 * 10; // 10 minutes
// Use middleware to set the default Content-Type
app.use(function (req, res, next) {
res.header(''Content-Type'', ''application/json'');
next();
});
app.get(''/api/endpoint1'', (req, res) => {
res.send(JSON.stringify({value: 1}));
})
app.get(''/api/endpoint2'', (req, res) => {
// Set Content-Type differently for this particular API
res.set({''Content-Type'': ''application/xml''});
res.send(`<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don''t forget me this weekend!</body>
</note>`);
})
Si está intentando enviar un archivo json, puede usar streams
var usersFilePath = path.join(__dirname, ''users.min.json'');
apiRouter.get(''/users'', function(req, res){
var readable = fs.createReadStream(usersFilePath);
readable.pipe(res);
});
Simplemente puede pretenderlo utilizando una tubería y uno de los muchos procesadores. Su aplicación siempre debe responder con la menor carga posible.
$ curl -i -X GET http://echo.jsontest.com/key/value/anotherKey/anotherValue | underscore print