์ด๋ค ๋ฒ์ ์ ๋น๋๊ธฐ๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๊น?
3.9.5
๋ฌธ์ ๊ฐ ๋ฐ์ํ ํ๊ฒฝ(๋ ธ๋ ๋ฒ์ /๋ธ๋ผ์ฐ์ ๋ฒ์ )
๋ ธ๋ 6.2.2 ๋ฐ 5.0.71.52
๋ญ ํ์ด?
์ด ์ฑ
var fs = require('fs'),
async = require('async'),
_dir = './data/';
var writeStream = fs.createWriteStream('./log.txt',
{'flags' : 'a',
'encoding' : 'utf8',
'mode' : 0666});
async.waterfall([
function readDir(callback) {
fs.readdir(_dir, function(err, files) {
callback(err,files);
});
},
function loopFiles(files, callback) {
files.forEach(function (name) {
callback (null, name);
});
},
function checkFile(file, callback) {
fs.stat(_dir + file, function(err, stats) {
callback(err, stats, file);
});
},
function readData(stats, file, callback) {
if (stats.isFile())
fs.readFile(_dir + file, 'utf8', function(err, data){
callback(err,file,data);
});
},
function modify(file, text, callback) {
var adjdata=text.replace(/somecompany\.com/g,'burningbird.net');
callback(null, file, adjdata);
},
function writeData(file, text, callback) {
fs.writeFile(_dir + file, text, function(err) {
callback(err,file);
});
},
function logChange(file, callback) {
writeStream.write('changed ' + file + '\n', 'utf8',
function(err) {
callback(err);
});
}
], function (err) {
if (err) {
console.log(err.message);
} else {
console.log('modified files');
}
});
๋ฌด์จ ์ผ์ด ์ผ์ด๋ ๊ฒ์ด๋ผ๊ณ ์์ํ์ต๋๊น?
์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์๋๋ก
์ค์ ๊ฒฐ๊ณผ๋ ์ด๋ ๋์?
๋๋ ์ ์
/home/examples/public_html/learnnode2-examples/chap3/node_modules/async/dist/async.js:837
if (fn === null) throw new Error("์ฝ๋ฐฑ์ด ์ด๋ฏธ ํธ์ถ๋์์ต๋๋ค.");
^^
์ค๋ฅ: ์ฝ๋ฐฑ์ด ์ด๋ฏธ ํธ์ถ๋์์ต๋๋ค.
์ฝ๋์ ๋ค์ ์น์ ์ ์๋ ์ฝ๋ฐฑ ํจ์
function loopFiles(ํ์ผ, ์ฝ๋ฐฑ) {
files.forEach(ํจ์(์ด๋ฆ) {
์ฝ๋ฐฑ(null, ์ด๋ฆ);
});
},
2์ฐจ์ ์์ ํจ๋ฐฐ.
์ฌ๋ฌ ๋ฒ์ ์ Node.js๋ฅผ ํตํด ์ด ์ฝ๋๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ์คํํ์ต๋๋ค. ๋ ธ๋ 6์ด ์ฒ์ ์ถ์๋์์ ๋ ์ด๊ฒ์ ํ ์คํธํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ ๋ฒ์งธ ๋ฐ๋ณต์์ ํจ์๋ null์ด ์๋์ง๋ง ๋น๋๊ธฐ ์ฝ๋์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ฌ ์ด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ฌ๊ธฐ์์ ์ฝ๋ฐฑ์ ์ฌ๋ฌ ๋ฒ ํธ์ถํ๊ธฐ ๋๋ฌธ์:
function loopFiles(files, callback) {
files.forEach(function(name) {
callback(null, name);
});
},
์ด ๊ฒฝ์ฐ async.forEach๋ฅผ ์ฌ์ฉํ์ธ์.
ํฅ๋ฏธ๋ก์ด. ์ด์ ๋ฒ์ ์ Node์์๋ ๋ฌธ์ ๊ฐ ์์๊ณ ์ค์ ๋ก Windows ์์คํ ์ Node 6.0.0์์ ์ฑ๊ณต์ ์ผ๋ก ์คํํ์ต๋๋ค.
๋ฐ๋ผ์ 6.0.0๊ณผ 6.2.2 ์ฌ์ด์ ๋ฌด์ธ๊ฐ๊ฐ ๋ณ๊ฒฝ๋์ด ๋ด์ฅ forEach๋ฅผ ์ฌ์ฉํ์ฌ Async๊ฐ ์ค๋จ๋ฉ๋๋ค.
์ฐธ๊ณ ๋ก async.forEach๋ ์๋ํ์ง ์์ต๋๋ค. ์ถฉ๋ํ์ง ์์ง๋ง ์๋ํ์ง ์์ต๋๋ค.
function loopFiles(files, callback) {
async.forEach(files, function (name, callback) {
callback (null, name);
});
},
์์งํ ๋งํด์ forEach๊ฐ ๋ฌธ์ ๋ฅผ ์ผ์ผํค๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ ๊ฐ ์๋ชป ์ฌ์ฉํ๊ณ ์๋ค๋ฉด ์๋ ค์ฃผ์ธ์.
์๊ฒ ์ต๋๋ค. ํฌ๊ธฐํฉ๋๋ค.
๋ด Windows ์ปดํจํฐ๋ฅผ 6.2.2๋ก ์ ๋ฐ์ดํธํ๋๋ฐ ์ด ์ฝ๋๊ฐ ์๋ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ด Linux ์ปดํจํฐ์์๋ ์๋ํ์ง ์์ต๋๋ค. ๋ ๋ค ๋์ผํ V8 ์์ง์ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค. ๋ ๋ค ๋์ผํ ๋ฒ์ ์ Async๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ๋ ๋ค ๋์ผํ ์์ ํ์ผ ๋๋ ํ ๋ฆฌ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
Linux์์๋ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. Windows์์๋ ๊ทธ๋ ์ง ์์ต๋๋ค.
@shelleyp ํญํฌ๊ฐ ์ฌ๋ฌ ํ์ผ์ ๋ํด ๋ถ์ ์ ํ๊ฒ ๊ตฌ์ฑ๋์์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ ๋ ๊ฐ์ ํญํฌ๋ก ๋ถ๋ฆฌํ๊ฑฐ๋ ๊ฐ ๋จ๊ณ์์ ๋ฐฐ์ด์ ๊ธฐ๋ํ๊ฒํ๊ณ ์ถ๋ค๊ณ ์๊ฐํฉ๋๋ค.
async.forEach
๋ณ๊ฒฝ์ด ์๋ํ์ง ์๋ ์ด์ ๋ loopFiles
์ฝ๋ฐฑ์ ํธ์ถํ์ง ์๊ธฐ ๋๋ฌธ์
๋๋ค. ๊ทธ ๊ธฐ๋ฅ์ ์ด์จ๋ ์ํ๋ ๊ฒ์ ์ํํ์ง ์์ต๋๋ค. firstFile ๋ณ๊ฒฝ loopFiles๋ฅผ (files, callback) => callback(null, files[0])
๋ก ์ฒ๋ฆฌํ๋ ค๋ ๊ฒฝ์ฐ ๊ทธ๋ ์ง ์์ผ๋ฉด checkFiles
, readData
๋ฐ modify
๋ฐฐ์ด์ ์์ํฉ๋๋ค(๋๋ ๋ ๋ฒ์งธ ํญํฌ ์์ฑ).
๋ชจ๋ ์ฝ๋๋ฅผ ์์ ํ์ง๋ ์๊ฒ ์ง๋ง ์ด๊ฒ์ด checkFiles
๊ธฐ๋ฅ์ ๋ณ๊ฒฝํ๋ ๋ฐฉ๋ฒ์
๋๋ค.
async.waterfall([
function readDir(callback) {
fs.readdir(_dir, callback);
},
function checkFile(files, callback) {
async.map(files, (file, cb) => {
fs.stat(_dir + file, function(err, stats) {
cb(err, {stat: stats, file: file});
});
}, (err, stats) => {
callback(err, stats);
});
},
....
๊ด์ฐฎ์.
์ด๊ฒ์ 6.2.2๊น์ง ์๋ํ๋ฏ๋ก ๋ด ์ฝ๋๊ฐ ์๋ํ์ง ์๋ ์์ธ์ด ๋ฌด์์ด๋ ๋ค๋ฅธ ์ฌ๋์ ์ฝ๋๊ฐ ์๋ํ์ง ์์ ์ ์์ต๋๋ค.
ํด๋น ์ฝ๋๊ฐ ์๋ํ๋๋ก ํด์ผ ํ๋ ์ ์ผํ ๊ฒ์ readdir ๋ชฉ๋ก์ด
ํ๋์ ํ์ผ(0๊ฐ์ ํ์ผ์ ๋ํด์๋ ์์๋จ).
๋ ๋ฒ์ ์ nod ๋ชจ๋์์ readdir์ ์ถ๋ ฅ์ ๋ค์ ํ์ธํ์๊ฒ ์ต๋๊น?
2016๋
6์ 27์ผ ์คํ 5์ 55๋ถ์ "Shelley Powers" [email protected]์ด ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
๊ด์ฐฎ์.
์ด๊ฒ์ด 6.2.2๊น์ง ์๋ํ๊ธฐ ๋๋ฌธ์ ๋ด ์ฝ๋๊ฐ
๋ค๋ฅธ ์ฌ๋์ ์ฝ๋๊ฐ ์๋ํ์ง ์์ ์ ์์ต๋๋ค.โ
์ด๊ธฐ/๋ซ๊ธฐ ์ํ๋ฅผ ์์ ํ๊ธฐ ๋๋ฌธ์ ์ด ๋ฉ์์ง๊ฐ ํ์๋ฉ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/caolan/async/issues/1199#issuecomment -228887866 ๋๋ ์์๊ฑฐ
์ค๋ ๋
https://github.com/notifications/unsubscribe/ADUIEAfvkwCmdjmkIZIjipFGYgPQ6SzYks5qQEbpgaJpZM4I_Nsg
.
์ด ์ฝ๋๋ ํญ์ ์ฌ๋ฌ ํ์ผ์์ ์๋ํ์ต๋๋ค. ๊ธ์, Linux์์ 6.2.2๊น์ง.
๊ทธ๋ฌ๋ ๋ฐฉ๊ธ Windows์์ ํ์ธํ์ต๋๋ค. ๋ค, 4๊ฐ์ ํ์ผ๋ก ์์ ํ์ต๋๋ค.
readdir์ ์ถ๋ ฅ์ [ 'data1.txt', 'data2.txt', 'data3.txt', 'data4.txt' ]์ ๋๋ค.
loopFiles์ ๋ํ ์ ๋ ฅ์ ๋์ผํฉ๋๋ค.
๊ทธ ์์ ์์ forEach๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ ์ฝ๋ฐฑ์ ๊ฐ๋ณ ํ์ผ ์ด๋ฆ์ ์ป์ต๋๋ค.
์ด๋ ์ด๊ฐ ์๋ ๋ฒฝ๋ ๋ฒฝ์ ๋ถ๋ชํ ์ ์ด ์์๋ค๋ฉด ์ด ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ์ง ์์์ ๊ฒ์ ๋๋ค. ํ์ง๋ง ํญ์ ํจ๊ณผ๊ฐ ์์์ต๋๋ค.
์ค์ํ์ง ์์ต๋๋ค. ํญ์ ์ฝ๋๋ฅผ ์ ๋ฐ์ดํธํ์ฌ ๋ฐฐ์ด ์ฒ๋ฆฌ๋ฅผ ์ ๊ฑฐํ ์ ์์ต๋๋ค. ์ง์ง ๋ฌธ์ ๋ ํ ํ๊ฒฝ์์๋ ์๋ํ์ง๋ง ๋ค๋ฅธ ํ๊ฒฝ์์๋ ์๋ํ์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ Node, V8 ๋ฐ Async๋ ๋์ผํ ๋ฒ์ ์ ๋๋ค.
๋ฐฉ๊ธ ๋ ธ๋ 6.0.0 ๋ฐ 6.2.2์ Ubuntu 16.04์์ ์ฝ๊ฐ ์์ ๋ ์ฝ๋๋ฅผ ์คํํ์ต๋๋ค. ๋ ๊ฒฝ์ฐ ๋ชจ๋ ๋์ผํ ์ถ๋ ฅ์ ์ป์์ต๋๋ค.
์์ ๋ ์คํฌ๋ฆฝํธ:
var fs = require('fs'),
async = require('async'),
_dir = './data/';
async.waterfall([
function readDir(callback) {
fs.readdir(_dir, callback);
},
function loopFiles(files, callback) {
files.forEach(function (name) {
callback (null, name);
});
},
console.log.bind(console)
], console.error)
$ ls data
> data1.txt data2.txt
๊ทธ๋ฌ๋ Windows์์๋ ์๋ํ์ง ์์์ต๋๋ค.
๋ฌผ๋ก , ๋น๋๊ธฐ ๋ฌธ์ ๊ฐ ์๋ ๊ฒ์ผ๋ก ์ข ๋ฃํ๊ฒ ์ต๋๋ค.
2016๋
6์ 27์ผ ์์์ผ ์คํ 8:20 Shelley Powers [email protected]
์ผ๋ค:
๊ทธ๋ฌ๋ Windows์์๋ ์๋ํ์ง ์์์ต๋๋ค.
โ
์ด๊ธฐ/๋ซ๊ธฐ ์ํ๋ฅผ ์์ ํ๊ธฐ ๋๋ฌธ์ ์ด ๋ฉ์์ง๊ฐ ํ์๋ฉ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/caolan/async/issues/1199#issuecomment -228914233 ๋๋ ์์๊ฑฐ
์ค๋ ๋
https://github.com/notifications/unsubscribe/ADUIEDNwRmcEjcAnVmSCHBBIHvdM6DL3ks5qQGiwgaJpZM4I_Nsg
.