node async module.export undefined

时间:2015-12-01 22:24:59

标签: node.js asynchronous callback fs

我有一个async waterfall的文件 这需要一个JSON文件目录,并将它们组合成一个对象并导出该对象以供第二个文件使用

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

var itemsDir = './data/';
var async = require('async');

function readDirectory(callback){
    console.log("reading directory");
    fs.readdir(itemsDir, function(err, files){
        if(err){
            callback(err);
        }
        console.log("calling back with directory array", files);
        return callback(null, files);
    });
}

function sortFiles(files,callback){
    console.log("sorting files", files);
    async.map(files, function(file, cb){
        console.log("sorting a single file, ", file);
        if(path.extname(file) === '.json'){         
            return cb(null,file);
        }   
    },
    function cb(err, results){
        console.log("returning files", files);
        callback(null, results);
    }); 
}

function buildItemList(jsonFiles, callback){
    console.log("building item list", jsonFiles);
    var itemList = {};
    jsonFiles.forEach(function(file){
        var data = require(itemsDir+file);  
        var keys = Object.keys(data);               
        itemList[keys] = data[keys[0]]; 
        console.log("building item list found data:", keys);        
    });     
    console.log("building item list returning data:", itemList);

    return callback(null, itemList);    
}

function getItemList(cb){
    async.waterfall([
            readDirectory,
            sortFiles,
            buildItemList
        ],
        function(err, results){
            if(err){
                throw err;
            }
            console.log("finished async function");
            cb(results);
        }
    );  
}

getItemList(function(results){
    console.log("exporting results", results);
    module.exports = results;
});

我的问题是我var items = require('filename.js')

我从{}而不是项目数组中得到require

第一个文件正在按预期创建对象并正确地流动,只需要它使其为空

1 个答案:

答案 0 :(得分:2)

请注意,必须立即完成对module.exports的分配。它不能在任何回调中完成。

module.exports.getItemList = function(cb) {
    async.waterfall([
        readDirectory,
        sortFiles,
        buildItemList
    ], function(err, results) {
        if (err) {
            throw err;
        }
        console.log("finished async function");
        cb(results);
    });
}

//  in other file
var items = require('filename.js');

items.getItemList(function(results) {
    var newarray = results;
});