Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript node.js服务器读取文件顺序?_Javascript_Node.js_Filesystems - Fatal编程技术网

Javascript node.js服务器读取文件顺序?

Javascript node.js服务器读取文件顺序?,javascript,node.js,filesystems,Javascript,Node.js,Filesystems,我的node.js应用程序中有2个js文件 文件a定义全局对象foo 在文件b中,我可以参考foo 但如果文件b在文件a之前加载,则会发生错误 我正在使用node的fs模块读取文件。我使用readdir,然后在每个文件上使用forEach require。在我的系统中,文件总是按字母顺序读取,因此从来没有任何问题 我可以依赖于按字母顺序读取这些文件吗?您可以按名称对文件数组进行排序,以确保安全 fs.readdir(path, function(err, files) { files.s

我的node.js应用程序中有2个js文件

文件a定义全局对象
foo

在文件b中,我可以参考
foo

但如果文件b在文件a之前加载,则会发生错误

我正在使用node的fs模块读取文件。我使用readdir,然后在每个文件上使用forEach require。在我的系统中,文件总是按字母顺序读取,因此从来没有任何问题


我可以依赖于按字母顺序读取这些文件吗?

您可以按名称对文件数组进行排序,以确保安全

fs.readdir(path, function(err, files) {
    files.sort(function(a, b) {
        return a < b ? -1 : 1;
    }).forEach(function(file, key) {
        // stuff
    });
});
fs.readdir(路径、函数(错误、文件){
文件排序(函数(a,b){
返回a
因为您使用的是一个文件数组,所以最好对数组进行排序,然后再对其进行处理;只有在前一个文件完成后才开始读取新文件。

暂时忽略全局变量通常是个坏主意的事实…:-)

如果您已经知道需要加载的文件路径,您可能希望使用以下结构:

var fs=require('fs'),
    vm=require('vm');

/**
 * loads and evals two initialization files in order
 * @param {callback} onComplete  called on init completion
 * @param {callback} on Error    called on error (optional)
 * @return null
 */

function init_app(onComplete,onError){

  var first_filepath  = './file1.js',
      second_filepath = './file2.js';

  // read/eval first file
  fs.readFile(first_filepath,function(first_err,first_result){

    if (first_err) {
      if(onError) {
        onError(first_err.message);
        return;
      }
      else {
        throw first_err;
      }
    }

    // evaluate first result
    try {
      vm.createScript(first_result).runInThisContext();
    }
    catch (e) {
      err_msg='failed to eval source from first file:' + e.type;
      if(onError) {
        onError(err_msg);
        return;
      }
      else {
        throw err_msg;
      }
    }

    // check for existence of foo global
    if(foo == undefined) {
      var msg='foo is undefined after first file read';
      if(onError) {
        onError(err_msg);
        return;
      }
      else {
        throw err_msg;
      }
    }

    // read/eval second (dependent) file
    fs.readFile(second_filepath, function(second_err,second_result){

      if (second_err) {
        if(onError) {
          onError(second_err.message);
          return;
        }
        else {
          throw second_err;
        }
      }

      // evaluate second, dependent result
      try {
        vm.createScript(second_result).runInThisContext();
      }
      catch (e) {
        err_msg='failed to eval source from second file:' + e.type;
        if(onError) {
          onError(err_msg);
          return;
        }
        else {
          throw err_msg;
        }
      }

      // trigger callback
      if(onComplete) onComplete();

    }); // end fs.readFile(second_filepath,...

  }); // end fs.readFile(first_filepath,...

}; // end init_app()
用作:

var onComplete = function(){ console.log('init complete'); },
    onError    = function(msg){ console.error(msg); };

init_app(onComplete,onError);
同样,如果在应用程序启动时只加载这些文件一次,则应使用require()