快速中间件中的异步等待不起作用



我是Node的新手,所以要温柔。我正在为我的婚礼创建一个应用程序,该应用程序将上传的客人名单(以 Excel 文件格式)转换为 JSON 数组,然后我可以使用它来构建有关每位客人的个人资料(饮食要求、回复答案等)。

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

我创建了以下路线:

router.post('/',
guestsController.upload,
guestsController.getGuestlist,
guestsController.displayGuestlist
);

这是我的客人控制器:

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);
};

目前,由于函数的同步性质,displayGuestlist 正在向控制台返回未定义,因为 covertExcel 尚未完成数据抓取。您可以看到我已尝试使用新的异步等待语法来解决此问题,但不幸的是它尚未修复它。

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

任何帮助者将不胜感激。

看起来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]);

您可以将代码封装在承诺中,并等待此承诺解决。

exports.getGuestlist = async (req, res, next) => {
let promise = new Promise((resolve, reject) => {
convertExcel(req.file.path, null, null, (err, guestData) => {
if(err) reject(err);
else resolve(guestData);
});
});
try {
let guestData = await promise;
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();
}
};

最新更新