如何在nodejs和mongodb中一起处理音频和json数据

问题描述 投票:0回答:1

我使用nodejs和mongodb开发后端api。 我的要求是存储 Audion 文件及其元数据,如艺术家、专辑等。 我正在使用 mongodb GridFs 来存储我的音频文件。 在此,我的音频文件存储在 unserongs.chunks 块中 和存储在songs.files.matadata下的元数据

我的要求是当用户请求任何歌曲时,我的应用程序应该响应音频文件及其元数据,以便用户可以播放音频并查看元数据。

我可以访问控制器中处理用户请求的元数据和音频,但我不知道如何使用元数据发送音频。

这是我的代码。

       const id = new ObjectId(req.params.id)

        const filesCollection = db.collection('songs.files');
        const data = await filesCollection.find(id).toArray();

        const matadata = data[0].matadata;

        

        res.set('content-type', 'audio/mpeg');
        res.set('accept-ranges', 'bytes');
        
        let bucket = new mongodb.GridFSBucket(db, {
            bucketName: 'songs'
        });
        

        let downloadStream = bucket.openDownloadStream(id);
        // console.log(downloadStream.name);

        
        downloadStream.on('data', (chunk) => {
            res.write(chunk);
        });

        downloadStream.on('error', (err) => {
            console.log(err);
            res.sendStatus(404);
        });
        
        downloadStream.on('end', () => {
            res.end();
        });

node.js mongodb multipartform-data audio-streaming
1个回答
0
投票

要在响应中同时发送音频数据和元数据,您可以发送自定义响应格式,例如 JSON。

const id = new ObjectId(req.params.id);

const filesCollection = db.collection('songs.files');
const data = await filesCollection.find(id).toArray();

const matadata = data[0].matadata;

res.set('content-type', 'application/json'); // Set the response content type to JSON

let bucket = new mongodb.GridFSBucket(db, {
    bucketName: 'songs'
});

let downloadStream = bucket.openDownloadStream(id);

const chunks = [];
downloadStream.on('data', (chunk) => {
    chunks.push(chunk);
});

downloadStream.on('error', (err) => {
    console.log(err);
    res.status(404).json({ error: 'File not found' });
});

downloadStream.on('end', () => {
    const audioData = Buffer.concat(chunks);
    const response = {
        metadata: matadata,
        audioData: audioData.toString('base64') // Convert audio data to base64
    };
    res.json(response); // Send the JSON response containing metadata and audio data
});

PS:JSON 响应格式包括元数据和 Base64 编码的音频数据。 在客户端,您需要解码 Base64 音频数据。

© www.soinside.com 2019 - 2024. All rights reserved.