Node.js新手求助:Service层调用无返回值问题(Express+Sequelize)
解决服务层异步数据返回问题
嗨,我来帮你排查这个问题~你遇到的核心问题是异步操作没有正确处理,导致路由里拿不到服务层返回的数据。让我一步步给你解释并修复:
问题分析
你的merchantService.addMerchant方法里调用了Sequelize的models.merchants.create(),这是一个异步操作(返回Promise),但你的方法没有把这个Promise返回出去。所以当路由里执行var merchant = merchantService.addMerchant(req);时,拿到的其实是undefined——因为函数默认返回undefined,而不是异步操作完成后的merchant数据。
修复步骤
1. 修改服务层代码(merchantService.js)
让addMerchant方法返回create操作的Promise:
var models = require("../models"); var merchantService = { addMerchant: (req) => { // 关键:返回create的Promise,让上层可以处理异步结果 return models.merchants.create(req.body).then((merchant) => { return merchant.dataValues; }); } } module.exports = merchantService;
2. 修改路由代码,处理异步结果
因为现在服务层返回的是Promise,路由里需要用async/await或者.then()来等待异步操作完成。推荐用async/await,代码更简洁易读:
router.post('/add-merchant', [ check('name').not().isEmpty(), check('city').not().isEmpty(), check('state').not().isEmpty(), check('country').not().isEmpty(), ], async (req, res, next) => { // 给路由函数加上async关键字 try { const errors = validationResult(req); if (!errors.isEmpty()) { return res.json({ errors: errors.array()}); } // 用await等待服务层的异步操作完成,拿到返回的merchant数据 var merchant = await merchantService.addMerchant(req); return res.json(merchant) } catch (error) { return res.json({"status": "error", "message": error.message}) } });
如果你习惯用.then()的写法,也可以这样修改路由:
router.post('/add-merchant', [ check('name').not().isEmpty(), check('city').not().isEmpty(), check('state').not().isEmpty(), check('country').not().isEmpty(), ], (req, res, next) => { try { const errors = validationResult(req); if (!errors.isEmpty()) { return res.json({ errors: errors.array()}); } // 通过.then()处理异步成功的情况,.catch()处理异常 merchantService.addMerchant(req) .then(merchant => res.json(merchant)) .catch(error => res.json({"status": "error", "message": error.message})); } catch (error) { return res.json({"status": "error", "message": error.message}) } });
为什么这样能解决问题?
Sequelize的所有数据库操作都是异步的,会返回Promise对象。只有当你返回这个Promise,并在上层用await或者.then()等待它完成,才能拿到异步操作的结果。原来的代码里,服务层没有返回Promise,所以路由里根本无法获取到数据库插入后的merchant数据。
内容的提问来源于stack exchange,提问作者az rnd
相关产品推荐
相关产品推荐

