异步等待Express中间件无法正常工作

Jam*_*ell 1 javascript node.js express async-await

我是Node的新手,所以要温柔.我正在为我的婚礼创建一个应用程序,它采用上传的访客列表(Excel文件格式)并将其转换为JSON数组,然后我可以使用它来构建关于每个访客的配置文件(饮食要求,rsvp答案等).

到目前为止,我在主页上有一个表单,允许用户上传.xlsx文件,当表单提交时,用户再次被重定向回主页.

我创建了以下路线:

router.post('/',
    guestsController.upload,
    guestsController.getGuestlist,
    guestsController.displayGuestlist
);
Run Code Online (Sandbox Code Playgroud)

这是我的客人控制器:

const multer = require('multer');
const convertExcel = require('excel-as-json').processFile;

const storage = multer.diskStorage({ //multers disk storage settings
    destination: function (req, file, cb) {
      cb(null, './uploads/')
    },
    filename: function (req, file, cb) {
        var datetimestamp = Date.now();
        cb(null, file.fieldname + '-' + datetimestamp + '.' + file.originalname.split('.')[file.originalname.split('.').length -1])
    }
});

exports.upload = multer({storage: storage}).single('file');

exports.getGuestlist = async (req, res, next) => {

  try {
     await convertExcel(req.file.path, null, null, (err, guestData) => {
         req.guestlist = guestData.map((guestObj) => Object.values(guestObj)[0]);
     });
     console.log(req.guestlist);
     next();
  } catch (e){
    res.json({error_code:1,err_desc:"Corrupted Excel file"});
    next();
  }
};

exports.displayGuestlist = (req, res) => {
    console.log(req.guestlist);
};
Run Code Online (Sandbox Code Playgroud)

目前由于函数的同步特性,displayGuestlist返回undefined到控制台,因为covertExcel还没有完成抓取数据.您可以看到我尝试使用新的async await语法来解决此问题,但遗憾的是它没有修复它.

我还尝试将displayGuestlist中的日志放在一个超时函数中,这已证明这纯粹是一个计时问题.

任何助手都会非常感激.

Jac*_*cob 7

它看起来convertExcel不是一个Promise返回功能,而是使用旧式回调.await不适用于那些,所以它等待,Promise.resolve(undefined)因为函数返回undefined,而不是Promise.值得庆幸的是,在Node 8及更高版本中,有一个promisify实用程序可以将回调式函数转换为Promise返回函数,以便await可以使用.

const { promisify } = require('util');
const convertExcel = promisify(require('excel-as-json').processFile);

// ...

const guestData = await convertExcel(req.file.path, null, null);
req.guestlist = guestData.map((guestObj) => Object.values(guestObj)[0]);
Run Code Online (Sandbox Code Playgroud)