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
.