【问题标题】:document.save() and res.redirect before function is complete in try/catch block在 try/catch 块中函数完成之前的 document.save() 和 res.redirect
【发布时间】:2021-12-28 12:57:02
【问题描述】:

我在使用我正在使用的转换函数时遇到了一些困难。由于我的 Mongodb 文档在转换完成之前保存,最终数组为空,其中应包括我的 URL(在回调中验证)。一切正常,但我的问题是我在 apiInstance.convertDocumentPptxToPng 完成之前重定向并保存文档。

try {
 const params = {
  Bucket: 'bucket', 
  Key: req.file.key
 }

await s3.getObject(params, async function(err, data) {
 if (err) console.log(err, err.stack); // an error occurred
 else {
  const inputFile = await Buffer.from(data.Body)
  apiInstance.convertDocumentPptxToPng(inputFile, callback)
 }

await course.save()
res.redirect('/course/admin')

})} catch(err) {
console.log(err)
}

【问题讨论】:

  • apiInstance.convertDocumentPptxToPng 是异步方法吗?如果是这样,那么您应该 await 它,就像您在该代码中使用所有其他异步方法一样。
  • 如果我等待这个,我从 aws superagent 收到一个错误:警告:超级代理请求已发送两次,因为 .end() 和 .then() 都被调用了。如果你使用 Promise,永远不要调用 .end() 警告:.end() 被调用了两次。 superagent superagent 不支持此功能:双重回调错误
  • 好的。该消息似乎来自代码的不同部分,或者来自从该代码调用的函数内部。我假设它给了你一个行号和文件名?
  • 是的,它来自回调。但我不知道为什么。如果我运行此代码,文档会被转换,并且 imageurl 会正确返回并推送到课程对象。但是 await course.save() 和 res.redirect 调用得太快了。
  • 是的。所以正如我所说,要么将它包装在一个承诺中,要么只是将保存和重定向调用移动到回调的末尾。

标签: javascript node.js express amazon-s3


【解决方案1】:

你正在等待s3.getObject,但你也给它一个回调函数。删除回调函数并使用 await。 course 未定义,但不确定是否正常。

try {
    const params = {
        Bucket: 'bucket',
        Key: req.file.key
    }

    const data = await new Promise( (resolve, reject) => s3.getObject(params,(err, data) => resolve(data)));

    const inputFile = await Buffer.from(data.Body);
    apiInstance.convertDocumentPptxToPng(inputFile, callback);
    await course.save();
    res.redirect('/course/admin');
    
} catch (err) {
    console.log(err)
}

【讨论】:

  • 如果我删除回调,我不会从 data.Body 属性中收到任何缓冲区。输入文件 = 未定义。 course 在 try 块之外。
  • 啊,s3.getObject 似乎没有返回 Promise。丢人现眼。好的,我已经答应了
  • 尝试了您承诺的解决方案。我们现在在缓冲区inputFile 中有数据,但重定向和保存问题与我的代码中的完全相同,即即时重定向和保存。在apiInstance.convertDocumentPptxToPng 回调中,我正在记录课程对象,它正确包含数组中转换后的图像。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多