Simplemente estoy tratando de crear un servidor de nodo que genere el estado HTTP de una URL determinada.
Cuando intento limpiar la respuesta con res.write, aparece el error: throw new TypeError ('el primer argumento debe ser una cadena o Buffer');
Pero si los reemplazo con console.log, todo está bien (pero necesito 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 confuso y se agradece cualquier ayuda.
response.statusCode
es un número, por ejemploresponse.statusCode === 200
, no'200'
. Como dice el mensaje de error,write
espera un objetostring
oBuffer
, por lo que debe convertirlo.Sin embargo, también tiene razón sobre su comentario de devolución de llamada.
res.end();
debe estar dentro de la devolución de llamada, justo debajo de suswrite
llamadas.fuente
Recibo este mensaje de error y menciona options.body
Tenía esto originalmente
Lo cambié a esto:
y parece funcionar ahora sin el mensaje de error ... aunque parece un error.
Creo que esta es la forma más oficial de hacerlo:
fuente
javascript request.post({ url: apiServerBaseUrl + '/v1/verify', json: { email: req.user.email } }
Bueno, obviamente está intentando enviar algo que no es una cadena o un búfer. :) Funciona con consola, porque la consola acepta cualquier cosa. Ejemplo simple:
Una forma de convertir cualquier cosa en cadena es hacer eso:
cada vez que intentas enviar algo. La otra forma es llamar al
.toString()
método:Tenga en cuenta que es posible que aún no sea lo que está buscando. Siempre debe pasar cadenas / búferes
.write
sin tales trucos.Como nota al margen: supongo que
request
es una operación asincrónica. Si ese es el caso, entoncesres.end();
se llamará antes de cualquier escritura, es decir, cualquier escritura fallará de todos modos (porque la conexión se cerrará en ese punto). Mueva esa línea al controlador:fuente
si desea escribir un objeto JSON en la respuesta, cambie el tipo de contenido del encabezado a application / json
fuente
Y existe otra posibilidad (no en este caso) cuando se trabaja con ajax (XMLhttpRequest), mientras se envía información al cliente, debe usar res.send (responsetext) en lugar de res.end (responsetext)
fuente
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
o tampón
fuente
El primer argumento debe ser de tipo cadena o Buffer. Objeto de tipo recibido
Recibía el error anterior mientras pasaba los datos del cuerpo al módulo de solicitud.
He pasado otro parámetro que es JSON: true y está funcionando.
fuente