0

我正在尝试读取 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;
        });
}


4

0 回答 0