如何在Node.js中同时替换多个文件的内容?

时间:2013-11-15 03:26:46

标签: javascript node.js

这里的问题是只修改了最后一个文件。但是所有文件都返回成功消息。它出什么问题了?感谢。

var fs = require('fs'),
    fileArr = [
                'base/general.css',
                'components/bootstrap_icons.css',
                'components/fullpage_slider.css'
            ];

for(var key in fileArr) {
    fs.readFile(fileArr[key],'utf8', function(err,data) {
        if(err){
            return console.log(err);
        } else {
            console.log('success');
        }

        var result = data.replace(/([^\/][.*]|[(.]).*?(\bimages\b)/g,'(images');

        fs.writeFile(fileArr[key], result, 'utf8', function(err) {
            if(err) {
                return console.log(err);
            } else {
                console.log('success');
            }
        });
    });
}

2 个答案:

答案 0 :(得分:1)

你有一个范围问题。

当您编写文件时,key已经在最后一点。

请改为尝试:

for (var key in fileArr) {
    (function (file) {
        //new scope for this file
        fs.readFile(file, 'utf8', function (err, data) {
            if (err) {
                return console.log(err);
            } else {
                console.log('success');
            }

            var result = data.replace(/([^\/][.*]|[(.]).*?(\bimages\b)/g, '(images');

            fs.writeFile(file, result, 'utf8', function (err) {
                if (err) {
                    return console.log(err);
                } else {
                    console.log('success');
                }
            });
        });
    })(fileArr[key]);
}

答案 1 :(得分:0)

或者你可以简单地使用Array.prototype.forEach()(MDN Docs)而不必求助于闭包或IIFE(立即调用函数表达式):

fileArr.forEach(function(file) {
    // do stuff
});