如何在Sequelize导入的模型中创建自定义方法?无返回值问题排查
自定义Sequelize模型函数无法返回数据的问题解决
嘿,作为从Laravel转Node.js的新手,踩异步操作的坑太正常了😉。你的问题根本不是Sequelize不支持自定义函数,而是异步操作的返回值处理错了。
先给你拆解问题:
你写的User.test函数里,User.findOne()是异步的(它返回一个Promise对象),但你的函数没有把这个Promise返回出去,而且内部then回调里的return data,只是回调函数的返回值,根本传不到外层的test函数里。所以你调用db.User.test()时,拿到的自然是undefined。
下面给你两种修改方案,选哪种都可以:
方案一:返回Promise并使用then处理
先修改User模型的test函数,让它返回查询的Promise:
module.exports = (sequelize, DataTypes) => { var User = sequelize.define('User', {},{ timestamps: false, freezeTableName:true, tableName:'agent_info' }); User.test = function(){ // 关键:返回findOne的Promise return User.findOne().then(data =>{ console.log(data); return data; }); }; return User; };
然后在路由里用then来获取异步结果:
app.get('/',(req,res,next) =>{ db.User.test() .then(temp => { console.log(temp); // 现在就能拿到数据了 // 如果要返回给前端,这里可以加 res.send(temp) }) .catch(err => { // 别忘了处理可能的数据库错误 next(err); }); });
方案二:用async/await简化异步代码
如果你习惯了Laravel里的同步写法,Node.js的async/await会更对你胃口,代码看起来更像同步:
首先修改User模型的test函数为async函数:
module.exports = (sequelize, DataTypes) => { var User = sequelize.define('User', {},{ timestamps: false, freezeTableName:true, tableName:'agent_info' }); User.test = async function(){ const data = await User.findOne(); // await等待异步结果 console.log(data); return data; }; return User; };
然后把路由的回调改成async函数,用await获取结果:
app.get('/', async (req,res,next) =>{ try { const temp = await db.User.test(); console.log(temp); // res.send(temp); } catch (err) { // 捕获错误并交给错误中间件处理 next(err); } });
最后补充两句
Sequelize完全支持这种自定义静态模型方法,你之前的思路没问题,只是没处理好异步操作的返回值。Node.js里数据库操作几乎都是异步的,和Laravel里的Eloquent不同——Laravel底层帮你处理了异步的细节,但Node.js里必须明确用Promise或者async/await来处理异步结果,这是新手转Node.js最容易踩的坑,多练几次就熟了~
内容的提问来源于stack exchange,提问作者Prince Arora
相关产品推荐
相关产品推荐

