我正在尝试读取 TSV 文件,并分两部分进行。标题信息写在 2 列中,主要数据写在 7 列中。因此,两次通过以使用此信息构建最终的 excel 文档。无论如何,我已经将我的读取函数组织到另一个文件中,我在我的主要快速路由文件中调用该文件,所有这些都来自一个上传的文件。我一直在主路由文件中的返回数据上得到一个“未定义”,尽管返回之前数据的控制台日志是正确的格式,一个对象数组。我对如何将这些数据返回给调用文件(函数)感到困惑。如果可能的话,我想分开我的逻辑。
-------- 路由文件
const express = require('express');
const router = express.Router();
const authorize = require('../../helpers/authorize');
const multer = require('multer');
const {
parseHeaderInfoFromEdl,
parsedMusicTracksFromEdl,
} = require('../../helpers/createMusicEdl');
// Multer configuration
const storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, 'uploads/');
},
// By default, multer removes file extensions so let's add them back
filename: function (req, file, cb) {
cb(null, file.originalname);
},
});
// Multer upload strategy
let upload = multer({ storage: storage });
router.post('/edl', upload.single('edl'), (req, res) => {
try {
// Check for file, return if no file found
if (!req.file) {
return res.status(500).json({
message: 'No file uploaded',
});
}
let filename = req.file.originalname;
// Parse out the header information
let header = parseHeaderInfoFromEdl(filename);
console.log(header); <------- returns UNDEFINED
res.status(200).json(header);
} catch (error) {
res.status(500).json({
message: 'Error creating EDL',
});
}
});
module.exports = router;
---- 功能文件
const fs = require('fs');
const csv = require('fast-csv');
const path = require('path');
module.exports = { parsedMusicTracksFromEdl, parseHeaderInfoFromEdl };
let uploadsDirectory = path.resolve(__dirname, '../uploads');
function parseHeaderInfoFromEdl(filename) {
let edlDataFromReadStream = [];
let edlHeaderInfo = [];
// Read the uploaded document and parse out the first 5 rows
fs.createReadStream(uploadsDirectory + '/' + filename)
.pipe(
// Parse data using 'fast-csv', limit to 5 rows for header information only
csv.parse({
delimiter: '\t',
maxRows: 5,
trim: true,
})
)
.on('error', (error) => console.error(error))
.on('data', (row) => {
// Build up row by row, the header information from the read doc
edlDataFromReadStream.push(row);
})
.on('end', () => {
// Map out the headers to a cleaner structure
edlDataFromReadStream.map((element) => {
edlHeaderInfo = {
'Name': element[1],
'Sample Rate': element[1],
'Bit Depth': element[1],
'Session Start Timecode': element[1],
'Timecode Format': element[1],
};
});
console.log(edlHeaderInfo); <----- returns correct format
return edlHeaderInfo;
});
}
function parsedMusicTracksFromEdl(path, filename) {
let parsedFile = [];
let correctedFile = [];
fs.createReadStream(path, filename)
.pipe(
csv.parse({
headers: true,
delimiter: '\t',
skipLines: 15,
trim: true,
})
)
.on('error', (error) => console.error(error))
.on('data', (row) => {
parsedFile.push(row);
})
.on('end', (rowCount) => {
parsedFile
.filter((r) => {
return r['CHANNEL'] == '1';
})
.map((row) => {
correctedFile.push({
Filename: row['CLIP NAME'],
'Start TC': row['START TIME'],
'End TC': row['END TIME'],
Duration: row['DURATION'],
});
return;
});
return correctedFile;
});
}