nodejs node instalar await async node.js http callback

node.js - instalar - node js fetch url



nodejs: el primer argumento debe ser una cadena o un bĂșfer: cuando se utiliza response.write con http.request (7)

Simplemente estoy tratando de crear un servidor de nodo que genere el estado HTTP de una URL determinada.

Cuando intento eliminar la respuesta con res.write, aparece el error: lanzar un nuevo TypeError (''el primer argumento debe ser una cadena o un búfer'');

Pero si los reemplazo con console.log, todo está bien (pero debo escribirlos en el navegador, no en la consola).

El codigo es

var server = http.createServer(function (req, res) { res.writeHead(200, {"Content-Type": "text/plain"}); request({ uri: ''http://www.google.com'', method: ''GET'', maxRedirects:3 }, function(error, response, body) { if (!error) { res.write(response.statusCode); } else { //response.end(error); res.write(error); } }); res.end(); }); server.listen(9999);

Creo que debería agregar una devolución de llamada en algún lugar, pero bastante confundido y cualquier ayuda es apreciada.


Aunque la pregunta está resuelta, compartir el conocimiento para aclarar el significado correcto del error.

El error dice que el parámetro necesario para la función de ruptura en cuestión no está en el formato requerido, es decir, cadena o búfer

La solución es cambiar el parámetro a cadena.

breakingFunction(JSON.stringify(offendingParameter), ... other params...);

o amortiguador

breakingFunction(BSON.serialize(offendingParameter), ... other params...);


Bueno, obviamente estás intentando enviar algo que no es una cadena o un búfer. :) Funciona con consola, porque la consola acepta cualquier cosa. Ejemplo simple:

var obj = { test : "test" }; console.log( obj ); // works res.write( obj ); // fails

Una forma de convertir cualquier cosa en una cadena es hacer eso:

res.write( "" + obj );

siempre que estés intentando enviar algo. La otra forma es llamar al método .toString() :

res.write( obj.toString( ) );

Tenga en cuenta que todavía puede no ser lo que está buscando. Siempre debe pasar cadenas / búferes a .write sin tales trucos.

Como nota al margen: asumo que la request es una operación asíncrona. Si ese es el caso, entonces res.end(); se llamará antes de cualquier escritura, es decir, cualquier escritura fallará de todos modos (porque la conexión se cerrará en ese momento). Mueva esa línea en el controlador:

request({ uri: ''http://www.google.com'', method: ''GET'', maxRedirects:3 }, function(error, response, body) { if (!error) { res.write(response.statusCode); } else { //response.end(error); res.write(error); } res.end( ); });


Recibo este mensaje de error y se menciona opciones.body

Tuve esto originalmente

request.post({ url: apiServerBaseUrl + ''/v1/verify'', body: { email: req.user.email } });

Lo cambié a esto:

request.post({ url: apiServerBaseUrl + ''/v1/verify'', body: JSON.stringify({ email: req.user.email }) });

y parece funcionar ahora sin el mensaje de error ... aunque parece un error.

Creo que esta es la forma más oficial de hacerlo:

request.post({ url: apiServerBaseUrl + ''/v1/verify'', json: true, body: { email: req.user.email } });


Si desea escribir un objeto JSON en la respuesta, cambie el tipo de contenido del encabezado a application / json

response.writeHead(200, {"Content-Type": "application/json"}); var d = new Date(parseURL.query.iso); var postData = { "hour" : d.getHours(), "minute" : d.getMinutes(), "second" : d.getSeconds() } response.write(postData) response.end();


Solicitud toma un método de devolución de llamada, es asíncrono! Así que supongo que, en el momento en que se ejecuta la devolución de llamada, se puede llamar a res.end() . Trate de cerrar la solicitud dentro de la devolución de llamada ?!


Y hay otra posibilidad (no en este caso) al trabajar con ajax (XMLhttpRequest), mientras que al enviar información al cliente, debe usar res.send (responsetext) en lugar de res.end (responsetext)


response.statusCode es un número, por ejemplo response.statusCode === 200 , no ''200'' . Como dice el mensaje de error, la write espera una string o un objeto Buffer , por lo que debe convertirlo.

res.write(response.statusCode.toString());

Sin embargo, también tienes razón acerca de tu comentario de devolución de llamada. res.end(); Debería estar dentro de la devolución de llamada, justo debajo de sus llamadas de write .