我的理解是,它们都创建了可写流,但我不确定如果你像下面的例子那样在之后对数据进行格式化,解析数据的意义是什么。
fs.createReadStream(path.resolve(__dirname, 'assets', 'snake_case_users.csv'))
.pipe(csv.parse({ headers: true }))
.pipe(csv.format({ headers: true }))
.transform((row, next) => {
User.findById(row.id, (err, user) => {
if (err) {
return next(err);
}
return next(null, {
id: row.id,
firstName: row.first_name,
lastName: row.last_name,
address: row.address,
// properties from user
isVerified: user.isVerified,
hasLoggedIn: user.hasLoggedIn,
age: user.age,
});
});
})
.pipe(process.stdout)
.on('end', () => process.exit());
我认为产生误解的原因是您给出的示例有点错误。实际的代码应该在转换之后通过管道传输format
流。
代码应该看起来有点像这样:
fs.createReadStream(path.resolve(__dirname, 'assets', 'snake_case_users.csv'))
.pipe(csv.parse({ headers: true }))
.pipe(csv.transform((row, next) => {
User.findById(row.id, (err, user) => {
if (err) {
return next(err);
}
return next(null, {
id: row.id,
firstName: row.first_name,
lastName: row.last_name,
address: row.address,
// properties from user
isVerified: user.isVerified,
hasLoggedIn: user.hasLoggedIn,
age: user.age,
});
});
}))
.pipe(csv.format({ headers: true }))
.pipe(process.stdout)
.on('end', () => process.exit());
这个想法是:
read file -> parse to objects -> transform object -> format to string -> print to stdout.
我还校正了代码,使其具有基于csv.transform
的transform
。
请参阅API文档中的更多内容。