【问题标题】:How to wait until the node's call back function executed如何等到节点的回调函数执行
【发布时间】:2020-08-06 17:05:02
【问题描述】:

我正在尝试使用节点上传文件/存储并将文件保存在 Grid FS 中。下面是代码示例。上传功能完美运行。由于节点的异步特性,响应会立即发送回浏览器。我想保持响应直到回调函数被执行。 注意:我也尝试在回调函数中发送最终响应,但仍然无效。

请提出一些想法。

const multer = require("multer");
const GridFsStorage = require("multer-gridfs-storage");
const mongoose = require("mongoose");
mongoose.connect(CONFIG.dbConfig, {useNewUrlParser: true, useUnifiedTopology: true} );

var storage = new GridFsStorage({
  url: CONFIG.dbConfig,
  options: { useNewUrlParser: true, useUnifiedTopology: true },
  file: (req, file) => {
    return {
      bucketName: "xyz",
      filename: `${file.originalname}`
    };
  }
});

const viewPage = (req, res) => {
  try {
    
    var uploadFile = multer({ storage: storage }).single("file");
     uploadFile(req, res, function(err) {
      if (req.file == undefined) {
        return res.send(`You must select a file.`);
      }

      /* code to save anthother Schema */
      fileDetails.save(function(err) {
        if (err) throw err;
      });
      
    });
    
    return res.send(`File has been uploaded.`);
  } catch (error) {
    console.log(error);
    return res.send(`Error when trying upload image: ${error}`);
  }
};

module.exports = {
  getPage:  viewPage
};

【问题讨论】:

  • 只需将return res.send 放在回调中即可。

标签: node.js express file-upload multer-gridfs-storage


【解决方案1】:

你必须使用 async 和 await

// convert multer function to async await
function uploadFile(req) {
    return new Promise(resolve => {
       var uploadFile = multer({ storage: storage }).single("file");
       if (req.file == undefined) {
          return resolve([`You must select a file.`, null]);
       }else {
          // do something
          return resolve([null, data])
       }
    });
}
const viewPage = async (req, res) => {
  try {
     let [err, data] = await uploadFile(req)
      // check error and send response
      // convert do async await similarly for below fileDetails.save  
 
      /* code to save anthother Schema (change this to async await) */
      fileDetails.save(function(err) {
        if (err) throw err;
      });
      
    });
    
    return res.send(`File has been uploaded.`);
  } catch (error) {
    console.log(error);
    return res.send(`Error when trying upload image: ${error}`);
  }
};

【讨论】:

  • 由于某种原因文件上传没有发生
  • 它在内部回调发送响应后工作。感谢@Take-Some-Bytes
  • 太棒了@Soft
猜你喜欢
  • 1970-01-01
  • 2020-08-12
  • 1970-01-01
  • 1970-01-01
  • 2018-10-06
  • 1970-01-01
  • 2013-09-26
  • 2017-09-03
  • 1970-01-01
相关资源
最近更新 更多