Sails.js中创建City记录后new_city变量为空的问题
问题分析与解决方案
嘿,这个问题我之前也碰到过!核心原因是你同时混用了async/await和回调函数两种异步处理方式,导致new_city无法正确获取到创建的实例对象,虽然数据库里确实成功插入了记录。
为什么会出现这种情况?
你看这段代码:
await City.create({ title: req.param('title'), ostan_owner: req.param('ostan') },function(err,new_city){ // ...你的回调逻辑 });
像Sequelize这类ORM框架的create方法,本身支持两种异步调用模式:
- 返回Promise,配合
await使用,成功时直接返回创建的实例 - 传入回调函数,通过回调参数获取实例或错误
但这两种模式不能混用!当你同时写了await和回调函数时,框架会优先触发回调逻辑,但此时await对应的Promise返回值会被忽略,而且回调里的new_city可能因为内部逻辑冲突变成空对象——但数据库插入操作已经执行完成,所以你能看到记录确实被创建了。
解决办法:二选一,只用一种异步处理方式
方式一:用async/await + try/catch(推荐,代码更清晰)
把回调去掉,改用try/catch捕获错误,直接从await拿到创建的实例:
try { // 直接从await获取创建的城市实例 const new_city = await City.create({ title: req.param('title'), ostan_owner: req.param('ostan') }); console.log(new_city); return res.json({'status': true, 'result': new_city}); } catch (err) { // 处理验证错误 if (err && err.invalidAttributes) { err = validator(City, err); return res.json({'status': false, 'errors': err.Errors}); } // 处理其他未知错误 return res.json({'status': false, 'errors': err.message || '创建失败'}); }
方式二:只用回调函数(适合老代码风格)
去掉await,完全用回调处理逻辑:
City.create({ title: req.param('title'), ostan_owner: req.param('ostan') }, function(err, new_city) { if (err && err.invalidAttributes) { err = validator(City, err); return res.json({'status': false, 'errors': err.Errors}); } // 这里的new_city就能正确拿到实例了 console.log(new_city); return res.json({'status': true, 'result': new_city}); });
总结
异步处理模式一定要保持一致,不要混合使用Promise/await和回调,这样既能避免变量为空的问题,代码可读性也会更高~
内容的提问来源于stack exchange,提问作者mas cm
相关产品推荐
相关产品推荐

