var content;
fs.readFile('./Index.html', function read(err, data) {
if (err) {
throw err;
}
content = data;
});
console.log(content);
Registros undefined
, ¿por qué?
javascript
node.js
karaxuna
fuente
fuente
Respuestas:
Para explicar en detalle lo que dijo @Raynos, la función que ha definido es una devolución de llamada asincrónica. No se ejecuta de inmediato, sino que se ejecuta cuando se completa la carga del archivo. Cuando llama a readFile, el control se devuelve inmediatamente y se ejecuta la siguiente línea de código. Entonces, cuando llama a console.log, su devolución de llamada aún no se ha invocado y este contenido aún no se ha configurado. Bienvenido a la programación asincrónica.
Enfoques de ejemplo
O mejor aún, como muestra el ejemplo de Raynos, envuelva su llamada en una función y pase sus propias devoluciones de llamada. (Aparentemente, esta es una mejor práctica) Creo que adquirir el hábito de envolver sus llamadas asíncronas en una función que tome una devolución de llamada le ahorrará muchos problemas y códigos desordenados.
fuente
'utf8'
después del nombre de archivo como parámetro adicional, de lo contrario, solo devolverá un búfer. Ver: stackoverflow.com/questions/9168737/…En realidad, hay una función síncrona para esto:
http://nodejs.org/api/fs.html#fs_fs_readfilesync_filename_encoding
Asincrónico
fs.readFile(filename, [encoding], [callback])
Lee asincrónicamente todo el contenido de un archivo. Ejemplo:
La devolución de llamada pasa dos argumentos (err, data), donde data es el contenido del archivo.
Si no se especifica codificación, se devuelve el búfer sin procesar.
SINCRÓNICO
fs.readFileSync(filename, [encoding])
Versión sincrónica de fs.readFile. Devuelve el contenido del archivo llamado nombre de archivo.
Si se especifica la codificación, esta función devuelve una cadena. De lo contrario, devuelve un búfer.
fuente
data
.if (Buffer.isBuffer( data){ result = data.toString('utf8'); }
Ahora hemos convertido el búfer en texto legible. Esto es bueno para leer un archivo de texto sin formato o probar el archivo con los tipos de formato. Podría hacer un try / catch para ver si es un archivo JSON, por ejemplo; pero solo después de que el búfer se convierta en texto. Mire aquí para obtener más información: nodejs.org/api/buffer.htmlAF 42 F1
. Muy práctico para la comunicación cliente-servidor-cliente.fuente
function readContent(callback)
, ¿escallback
una palabra reservada? Quiero decir, ¿es esta la forma estándar de implementar devoluciones de llamada para sus funciones personalizadas? Acabo de empezar a aprender nodo.event
oc
cualquier nombre que desee, no es una palabra reservada en Javascript, y supongo que lo mismo se extiende a Node.js.readContent(function (err, content)
me da un error de sintaxis al usar la función como parámetro.Usando promesas con ES7
Uso asincrónico con mz / fs
El
mz
módulo proporciona versiones prometidas de la biblioteca del nodo central. Usarlos es simple. Primero instale la biblioteca ...Luego...
Alternativamente, puede escribirlos en funciones asincrónicas:
fuente
use esto para llamar a un archivo sincrónicamente, sin codificar su salida de muestra como un búfer.
fuente
Esta línea funcionará
fuente
fs.readFileSync
es un método de sincronización, por lo que no es necesarioawait
. Aguardar es útil con promesas ( nodejs.org/api/fs.html#fs_fs_promises_api ), cuando desea escribir código asíncrono con una sintaxis similar al código de sincronización.fuente
sincronización y lectura de archivos asíncronos:
Node Cheat Disponible en read_file .
fuente
Como se dijo,
fs.readFile
es una acción asincrónica. Significa que cuando le dice al nodo que lea un archivo, debe tener en cuenta que tomará algún tiempo y, mientras tanto, el nodo continuó ejecutando el siguiente código. En tu caso es:console.log(content);
.Es como enviar una parte de su código para un viaje largo (como leer un archivo grande).
Echa un vistazo a los comentarios que he escrito:
Es por eso
content
que todavía está vacío cuando lo registras. El nodo aún no ha recuperado el contenido del archivo.Esto podría resolverse moviéndose
console.log(content)
dentro de la función de devolución de llamada, justo despuéscontent = data;
. De esta manera, verá el registro cuando el nodo termine de leer el archivo y luegocontent
obtenga un valor.fuente
Use la biblioteca de promisify incorporada (Nodo 8+) para hacer que estas antiguas funciones de devolución de llamada sean más elegantes.
fuente
const doStuff = async (filePath) => fs.readFileSync(filePath, 'utf8');
, sin necesidad de util.promisify wrap.fuente
Esto es solo porque el nodo es asíncrono y no esperará la función de lectura y tan pronto como el programa se inicie, consolará el valor como indefinido, lo cual es realmente cierto porque no hay un valor asignado a la variable de contenido. Para manejar podemos usar promesas, generadores, etc. Podemos usar promesas de esta manera.
fuente
La siguiente función funcionaría para
async
encapsular othen
cadenas de promesafuente
puedes leer el archivo por
Agregando puede escribir en el archivo,
e incluso encadenarlo
fuente
Para decirlo más o menos, se trata de node.js, que es de naturaleza asíncrona.
Cuando hablamos de asíncrono, estamos hablando de hacer o procesar información o datos mientras tratamos con otra cosa. No es sinónimo de paralelo, recuerde.
Tu codigo:
Con su muestra, básicamente hace primero la parte de console.log, por lo tanto, la variable 'contenido' no está definida.
Si realmente quieres la salida, haz algo como esto en su lugar:
Esto es asincrónico. Será difícil acostumbrarse, pero es lo que es. Nuevamente, esta es una explicación aproximada pero rápida de lo que es asíncrono.
fuente