微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用fs.readFile读取并返回Node.js中的多个文件

我正在编写一个简单的请求处理程序来返回一对css文件.使用fs.readFileSync这很简单.但是,我无法使用异步版本的readFile来完成同样的任务.以下是我的代码让我的response.write()方法调用在两个不同的回调之间的拆分似乎是有问题的.有人可以指出我做错了什么吗?有趣的是,如果我将response.end()放在第一个else语句里面,这段代码可以工作.但是,这会产生一个问题,因为第二个css文件没有被返回(因为response.end()已经被触发).

function css(response) {

  response.writeHead(200,{"Content-Type": "text/css"});

  fs.readFile('css/bootstrap.css',function(error,content){
    if(error){
      console.log(error);
    }
    else{
      response.write(content);
    }
  });
  fs.readFile('css/bootstrap-responsive.css',content){
    if(error){
      console.log(error);
    }
    else{
      response.write(content)
    }
  });
  response.end();
}

解决方法

您的主要问题是response.end()立即被调用.您只需在文件完成response.write调用后才调用它.

最简单的方法是使用控制流程库.管理多个异步回调通常很复杂.

https://github.com/joyent/node/wiki/modules#wiki-async-flow

我要使用async图书馆,因为它是我最了解的那个.

var fs = require('fs');
var async = require('async');

function css(response) {
  response.writeHead(200,{"Content-Type": "text/css"});

  async.eachSeries(
    // Pass items to iterate over
    ['css/bootstrap.css','css/bootstrap-responsive.css'],// Pass iterator function that is called for each item
    function(filename,cb) {
      fs.readFile(filename,function(err,content) {
        if (!err) {
          response.write(content);
        }

        // Calling cb makes it go to the next item.
        cb(err);
      });
    },// Final callback after each item has been iterated over.
    function(err) {
      response.end()
    }
  );
}

如果你想完成这个没有一个图书馆,或者只是想要另一种方式,这是我会如何做更直接.基本上,一旦两个文件读取完成,您就会保持计数并调用结束.

function css(response) {
  response.writeHead(200,{"Content-Type": "text/css"});

  var count = 0;
  var handler = function(error,content){
    count++;
    if (error){
      console.log(error);
    }
    else{
      response.write(content);
    }

    if (count == 2) {
      response.end();
    }
  }

  fs.readFile('css/bootstrap.css',handler);
  fs.readFile('css/bootstrap-responsive.css',handler);
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐