我使用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();
});
要在响应中同时发送音频数据和元数据,您可以发送自定义响应格式,例如 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 音频数据。