Node.js Stream :- Streams 函数没有为同一文件第二次调用
Node.js Stream :- Streams functions are not invoking for second time for same file
SFTB,我有一个 POST
请求通过 multipart/form-data
到达我的服务器,现在我想从那个请求中获取文件的内容。
我正在读取通过 streams
提供的文件以及到 cvsParser
的管道,这只是 csv-streamify
的一个实例,之后我们将内容传递给自定义 Transform
使用 http
[我正在使用 got
获取资源的函数],获取资源后我正在压缩图像。
现在的问题是,当我第一次提交文件时,它像魅力一样工作但是,当我第二次尝试提交相同的文件时,它跳过了整个 stream
部分并直接跳转到 finish
事件处理程序。
第一次记录:-
Submitting
Converting image at C:\image-minifier-sqd\build\src69004088476.bell.svg
Build is present at build\dest69004088476.bell.svg
Converting image at C:\image-minifier-sqd\build\src69004088996.mail.svg
Build is present at build\dest69004088996.mail.svg
Finished
我第二次提交相同文件时的日志[前端刷新和不刷新]
Submitting
Finished
仅供参考,在前端,我正在使用 fetch
API 发出 POST
请求。
我的服务器代码:-
function createParser() {
var parser = new Transform({objectMode: true});
parser._transform = function(data, encoding, done) {
const date = new Date();
const link = data.toString().slice(2,-3);
const fileName = date.getTime()+ '.' +link.split( '/' ).pop(),
filePath = path.resolve(__dirname,`build/src/${fileName}`);
got.stream(link)
.pipe(fs.createWriteStream(filePath,{flags:'a'}))
.on('close',_ => {
console.log(`Converting image at ${filePath}`)
//Compressing images
imagemin([filePath],'build/dest',{
plugins: [
imageminMozjpeg(),
imageminPngquant({speed: 10}),
imageminSvgo(),
imageminGifsicle()
]
})
.then(file => {
console.log(`Build is present at ${file[0].path}`);
this.push(file[0].path);
done();
});
});
};
return parser;
}
//A request comes here with multipart/form-data
app.post('/submit/csv',upload.array('data'),(req, res) => {
console.log('Submitting')
const stream = fs.createReadStream(path.resolve(__dirname,req.files[0].path))
.pipe(csvParser)
.pipe(createParser())
.pipe(res)
.on('finish',_ => {
log('Finished');
res.end();
});
});
谢谢。
我认为问题与 csvParser
的重用有关。尝试将 csvParser 的创建包装在一个函数中并改为使用它:
function createCsvParser() {
const parser = csv();
parser.on('data', function (line) {
[...]
});
return parser;
}
并将.pipe(csvParser)
更改为.pipe(createCsvParser())
。
希望对您有所帮助。
SFTB,我有一个 POST
请求通过 multipart/form-data
到达我的服务器,现在我想从那个请求中获取文件的内容。
我正在读取通过 streams
提供的文件以及到 cvsParser
的管道,这只是 csv-streamify
的一个实例,之后我们将内容传递给自定义 Transform
使用 http
[我正在使用 got
获取资源的函数],获取资源后我正在压缩图像。
现在的问题是,当我第一次提交文件时,它像魅力一样工作但是,当我第二次尝试提交相同的文件时,它跳过了整个 stream
部分并直接跳转到 finish
事件处理程序。
第一次记录:-
Submitting
Converting image at C:\image-minifier-sqd\build\src69004088476.bell.svg
Build is present at build\dest69004088476.bell.svg
Converting image at C:\image-minifier-sqd\build\src69004088996.mail.svg
Build is present at build\dest69004088996.mail.svg
Finished
我第二次提交相同文件时的日志[前端刷新和不刷新]
Submitting
Finished
仅供参考,在前端,我正在使用 fetch
API 发出 POST
请求。
我的服务器代码:-
function createParser() {
var parser = new Transform({objectMode: true});
parser._transform = function(data, encoding, done) {
const date = new Date();
const link = data.toString().slice(2,-3);
const fileName = date.getTime()+ '.' +link.split( '/' ).pop(),
filePath = path.resolve(__dirname,`build/src/${fileName}`);
got.stream(link)
.pipe(fs.createWriteStream(filePath,{flags:'a'}))
.on('close',_ => {
console.log(`Converting image at ${filePath}`)
//Compressing images
imagemin([filePath],'build/dest',{
plugins: [
imageminMozjpeg(),
imageminPngquant({speed: 10}),
imageminSvgo(),
imageminGifsicle()
]
})
.then(file => {
console.log(`Build is present at ${file[0].path}`);
this.push(file[0].path);
done();
});
});
};
return parser;
}
//A request comes here with multipart/form-data
app.post('/submit/csv',upload.array('data'),(req, res) => {
console.log('Submitting')
const stream = fs.createReadStream(path.resolve(__dirname,req.files[0].path))
.pipe(csvParser)
.pipe(createParser())
.pipe(res)
.on('finish',_ => {
log('Finished');
res.end();
});
});
谢谢。
我认为问题与 csvParser
的重用有关。尝试将 csvParser 的创建包装在一个函数中并改为使用它:
function createCsvParser() {
const parser = csv();
parser.on('data', function (line) {
[...]
});
return parser;
}
并将.pipe(csvParser)
更改为.pipe(createCsvParser())
。
希望对您有所帮助。