使用GridFS保存音频数据

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

此代码(见下文)仅部分有效,我需要一些帮助来修复它。

函数 saveAudioToGridFS() 应该将文件 ID 返回给其调用函数。

我可以检查要返回的值是否已正确计算(通过 console.log(s))。

但是由于一些同步问题或类似的问题,它没有传递到调用方。

我该如何解决这个问题?欢迎任何相关提示。

function saveAudioToGridFS(audioBlob) {
  const gridFSBucket = new mongoose.mongo.GridFSBucket(conn.db),
        writeStream = gridFSBucket.openUploadStream(getAudioName())

  // In the code below, writeStream.id.toString() is precisely what
  // should be returned to the calling function.
  writeStream.on('close', (file) => {
    console.log("saveAudioToGridFS.close-block")
    console.log("ID=",writeStream.id.toString())
    resolve(writeStream.id.toString())
  });

  writeStream.on('finish', (file) => {
    console.log("saveAudioToGridFS.finish-block")
    console.log("ID=",writeStream.id.toString())
    resolve(writeStream.id.toString())
  });

  writeStream.on('error', (error) => {
    console.log("saveAudioToGridFS.error-block")
    reject(error);
  });

  console.log("TRACE 1 : before createReadStream.")
  streamifier.createReadStream(audioBlob).
   pipe(writeStream)
  console.log("TRACE 2 : after createReadStream.")
} /* End of saveAudioToGridFS */


server.post('/upload', async (req, res) => {
  try {
    if (!req.body.audio) {
      return res.status(400).json({message: 'No audio data uploaded.'});
    }

    console.log("Before call to saveAudioToGridFS")
    const audioBuffer = Buffer.from(req.body.audio, 'base64'),
          fileId = saveAudioToGridFS(audioBuffer);

    console.log("fileId=",fileId) // The expected value is missing here.
    // Consequently the value of fileId is missing in the following code.

    // Create a new record object
    const newRec = new AppCollectn({
      channelID:req.body.channel,
      voiceRecordID:fileId,
      timeStamp: new Date().getTime()
    });

    // Insert the record in our MongoDB database
    await newRec.save();

    .....
    res.json({fileId});
  } catch (error) {
    console.error(error);
    res.status(500).json({
      message: 'An error occurred during upload.',
      error: JSON.stringify(error)
    });
  }
});
javascript mongodb express gridfs gridfs-stream
1个回答
0
投票

将您的 saveAudioToGridFS 转换为返回承诺的异步函数。

这是代码

function saveAudioToGridFS(audioBlob) {
  return new Promise((resolve, reject) => {
    const gridFSBucket = new mongoose.mongo.GridFSBucket(conn.db),
      writeStream = gridFSBucket.openUploadStream(getAudioName())

    writeStream.on('close', (file) => {
      console.log("saveAudioToGridFS.close-block")
      console.log("ID=",writeStream.id.toString())
      resolve(writeStream.id.toString()) 
    });

   writeStream.on('finish', (file) => {
     console.log("saveAudioToGridFS.finish-block")
     console.log("ID=",writeStream.id.toString())
     resolve(writeStream.id.toString()) 
   });

   writeStream.on('error', (error) => {
     console.log("saveAudioToGridFS.error-block")
     reject(error); 
  });

   console.log("TRACE 1 : before createReadStream.")
   streamifier.createReadStream(audioBlob).
    pipe(writeStream)
   console.log("TRACE 2 : after createReadStream.")
 });

}




server.post('/upload', async (req, res) => {
  try {
    if (!req.body.audio) {
      return res.status(400).json({message: 'No audio data uploaded.'});
    }

    console.log("Before call to saveAudioToGridFS")
    const audioBuffer = Buffer.from(req.body.audio, 'base64');

  
   const fileId = await saveAudioToGridFS(audioBuffer); 

   console.log("fileId=",filed)

   const newRec = new AppCollectn({
     channelID:req.body.channel,
     voiceRecordID:fileId,
     timeStamp: new Date().getTime()
   });

   // Insert the record in our MongoDB database
   await newRec.save();

   .....
   res.json({fileId});


  } catch (error) {
    console.error(error);
    res.status(500).json({
     message: 'An error occurred during upload.',
     error: JSON.stringify(error)
   });
  }
});
© www.soinside.com 2019 - 2024. All rights reserved.