2011-05-12 56 views
2

我在我的Node.js应用2个js文件node.js服务器读取文件的顺序?

文件定义一个全局对象foo

文件B中可以参考我foo

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

我正在使用节点的fs模块来读取文件。我使用readdir,然后每个文件都需要forEach。在我的系统中,文件总是按字母顺序读取,所以永远不会有任何问题。

我可以依赖那些按字母顺序阅读的文件吗?

回答

10

您可以按名称排序文件数组,以确保它的安全。

fs.readdir(path, function(err, files) { 
    files.sort(function(a, b) { 
     return a < b ? -1 : 1; 
    }).forEach(function(file, key) { 
     // stuff 
    }); 
}); 
0

因为你与文件的数组工作,你最好的办法是进行排序,则阵列通过它的工作;只有在前一个文件完成时才开始读取新文件。

0

暂时忽略一个事实,即全局变量通常是一个糟糕的主意...... :-)

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

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); 

话又说回来,如果你只在你的应用程序的启动,一旦加载这些文件,你应该使用要求()。