You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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方法,本身支持两种异步调用模式:

  1. 返回Promise,配合await使用,成功时直接返回创建的实例
  2. 传入回调函数,通过回调参数获取实例或错误

但这两种模式不能混用!当你同时写了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:02:54