Get data from fs.readFile

前端 未结 15 2369
滥情空心
滥情空心 2020-11-22 15:38
var content;
fs.readFile(\'./Index.html\', function read(err, data) {
    if (err) {
        throw err;
    }
    content = data;
});
console.log(content);


        
相关标签:
15条回答
  • 2020-11-22 16:10

    The following is function would work for async wrap or promise then chains

    const readFileAsync =  async (path) => fs.readFileSync(path, 'utf8');
    
    0 讨论(0)
  • 2020-11-22 16:11

    sync and async file reading way:

    //fs module to read file in sync and async way
    
    var fs = require('fs'),
        filePath = './sample_files/sample_css.css';
    
    // this for async way
    /*fs.readFile(filePath, 'utf8', function (err, data) {
        if (err) throw err;
        console.log(data);
    });*/
    
    //this is sync way
    var css = fs.readFileSync(filePath, 'utf8');
    console.log(css);
    

    Node Cheat Available at read_file.

    0 讨论(0)
  • 2020-11-22 16:12
    var content;
    fs.readFile('./Index.html', function read(err, data) {
        if (err) {
            throw err;
        }
        content = data;
    });
    console.log(content);
    

    This is just because node is asynchronous and it will not wait for the read function and as soon as the program starts it will console the value as undefined, Which is actually true because there is no value assigned to content variable. To handle we can use promises, generators etc. We can use promise in this way.

    new Promise((resolve,reject)=>{
        fs.readFile('./index.html','utf-8',(err, data)=>{
            if (err) {
                reject(err); // in the case of error, control flow goes to the catch block with the error occured.
            }
            else{
                resolve(data);  // in the case of success, control flow goes to the then block with the content of the file.
            }
        });
    })
    .then((data)=>{
        console.log(data); // use your content of the file here (in this then).    
    })
    .catch((err)=>{
        throw err; //  handle error here.
    })
    
    0 讨论(0)
  • 2020-11-22 16:14

    There is actually a Synchronous function for this:

    http://nodejs.org/api/fs.html#fs_fs_readfilesync_filename_encoding

    Asynchronous

    fs.readFile(filename, [encoding], [callback])

    Asynchronously reads the entire contents of a file. Example:

    fs.readFile('/etc/passwd', function (err, data) {
      if (err) throw err;
      console.log(data);
    });
    

    The callback is passed two arguments (err, data), where data is the contents of the file.

    If no encoding is specified, then the raw buffer is returned.


    SYNCHRONOUS

    fs.readFileSync(filename, [encoding])

    Synchronous version of fs.readFile. Returns the contents of the file named filename.

    If encoding is specified then this function returns a string. Otherwise it returns a buffer.

    var text = fs.readFileSync('test.md','utf8')
    console.log (text)
    
    0 讨论(0)
  • 2020-11-22 16:18

    To elaborate on what @Raynos said, the function you have defined is an asynchronous callback. It doesn't execute right away, rather it executes when the file loading has completed. When you call readFile, control is returned immediately and the next line of code is executed. So when you call console.log, your callback has not yet been invoked, and this content has not yet been set. Welcome to asynchronous programming.

    Example approaches

    const fs = require('fs');
    // First I want to read the file
    fs.readFile('./Index.html', function read(err, data) {
        if (err) {
            throw err;
        }
        const content = data;
    
        // Invoke the next step here however you like
        console.log(content);   // Put all of the code here (not the best solution)
        processFile(content);   // Or put the next step in a function and invoke it
    });
    
    function processFile(content) {
        console.log(content);
    }
    

    Or better yet, as Raynos example shows, wrap your call in a function and pass in your own callbacks. (Apparently this is better practice) I think getting into the habit of wrapping your async calls in function that takes a callback will save you a lot of trouble and messy code.

    function doSomething (callback) {
        // any async callback invokes callback with response
    }
    
    doSomething (function doSomethingAfter(err, result) {
        // process the async result
    });
    
    0 讨论(0)
  • 2020-11-22 16:19
    var data = fs.readFileSync('tmp/reltioconfig.json','utf8');
    

    use this for calling a file synchronously, without encoding its showing output as a buffer.

    0 讨论(0)
提交回复
热议问题