-
-
Save dbonillaf/9e5367a6351d522ed6ba to your computer and use it in GitHub Desktop.
var express = require('express'); | |
var fs = require('fs'); | |
var handlebars = require('handlebars'); | |
var source = new Buffer(10); | |
// El objeto source no contiene nada | |
console.log(source.toString('utf-8')); | |
fs.readFile('home.html', function(error, source){ | |
if(error) { | |
console.log(error); | |
} else { | |
// El objeto source contiene los datos del fichero | |
console.log(source.toString('utf-8')); | |
} | |
}); | |
var app = express(); | |
app.get('/', function (req, res) { | |
// El objeto source VUELVE a no contener nada | |
res.send(source.toString('utf-8')); | |
}); | |
var server = app.listen(3000, function () { | |
var host = server.address().address; | |
var port = server.address().port; | |
console.log('Backend listo para combatir en http://%s:%s', host, port); | |
}); |
readFileSync
devuelve directamente los datos, no tiene callback. En cualquier caso de esta forma:
fs.readFileSync('home.html', funcioncita('', source));
Estás directamente llamando a funcioncita
ya que le has añadido los paréntesis. source
no se puede pasar de la forma en que tú lo estás intentando. Tendrías que pasar una referencia a la función:
fs.readFileSync('home.html', funcioncita)
.
Resolviendo tu duda, lo que creo que deberías hacer si vas a usar readFileSync
es: source = fs.readFileSync('home.html')
Hola David,
Lo que necesitas para que esto funcione como esperas, sería crear un ReadStream desde el fichero y pasarlo al WriteStream de la respuesta del servidor:
var express = require('express');
var fs = require('fs');
var path = require( 'path' );
var app = express();
app.get('/', function (req, res) {
res.set('Content-Type', 'text/html');
fs.createReadStream( path.join( __dirname + '/index.html' ) ).pipe( res );
});
var server = app.listen(3000, function () {
var host = server.address().address;
var port = server.address().port;
console.log('Backend listo para combatir en http://%s:%s', host, port);
});
Espero que te ayude 😄
p.d: Te dejo un post de mi blog donde hablo sobre como trabajar con ReadStream:
http://carlosvillu.com/aprende-a-usar-readstream-en-nodejs/
var source = new Buffer(10);
// El objeto source no contiene nada
console.log("ANTES DE NADA");
console.log(source.toString('utf-8'));
function funcioncita(error, data){
if(error) {
console.log(error);
} else {
// El objeto source contiene los datos del fichero
console.log("DENTRO DEL MÉTODO");
console.log(data.toString('utf-8'));
}
};
fs.readFileSync('home.html', funcioncita('', source)); // el callback no se ejecuta NUNCA
// estas ejecutando una función que su resultado se pasa como segundo parametro a 'fs.readFileSync'
// que según la doc de node, espera que esto sean las opciones (encoding, etc...)
// es decir 'funcioncita' retorna _undefined_ (no return definido), por lo que en realidad estas ejecuutando:
// fs.readFileSync('home.html', undefined);
// _readFileSync_ es sincrono y usa el metodo de asignacion directa:
// var content = fs.readFileSync('home.html');
// la variable source directamente no estas haciendo nada con ella.
console.log("FUERA DEL MÉTODO");
console.log(source.toString('utf-8'));
var app = express();
app.get('/', function (req, res) {
// El objeto source VUELVE a no contener nada
res.send(source.toString('utf-8'));
});
¡Gracias a todos por la ayuda y por lo aprendido!
Ya me cuesta usar el Sync en algo como Node, se supone que la potencia viene de no utilizarlo NUNCA 😄 Creo que mucho de la "solución" de esto es cambiar el paradigma de pensamiento y crear una función que encapsule la lectura de fichero de forma asíncrona e invocarlo con parametros desde cada app.get... aunque funcionalmente sería una tontería porque, aunque dejara el fichero cargado en memoria, la primera vez que se invocara, por su asincronía, lo más seguro es que la petición HTTP GET no devolviera nada.
Lo más seguro sería hacer la carga de los n ficheros al arrancar la app, una sola vez, de forma síncrona.
No hay un paso por referencia del primer source
que declaras. Es simplemente otra variable. Es como si en Java haces esto:
class Foo {
private String source;
public void bar(String source) {
// Este source no es el otro source.
// En Java concretamente podrías usar this.source para acceder al otro
}
}
@beleiros no hace falta todo eso para usar Express, puedes servir HTML a pelo Capello. La idea es cargar plantillas de Handlebars el día de mañana, compilarlas y demás... pero vamos, eso escapa del "scope" de este hilo 😃