Adonis Lucid ORM未返回数据求助:新手查询遇空对象问题
解决AdonisJS查询数据库返回空对象/ Promise pending的问题
别担心,刚上手AdonisJS遇到这种异步相关的问题太正常了!你的代码里核心问题是没有处理数据库查询的异步操作——Adonis的ORM查询(不管是User.query().where().first()还是User.find(1))都是异步的,它们返回的是一个Promise对象,而不是直接的查询结果。
你直接把User.query()...赋值给data时,这个Promise还处于<pending>(等待完成)状态,所以console.log(data)会输出Promise { <pending> },而把这个未完成的Promise返回给前端时,最终会被序列化成空对象{}。
正确的解决方法:用async/await处理异步查询
这是最直观也最推荐的写法,给路由处理函数加上async关键字,然后用await等待查询完成:
Route.get('/usertest', async ({ response }) => { const User = use('App/Models/User') // 等待Promise完成,拿到实际的用户数据 let data = await User.query().where('id', 1).first() // 也可以用更简洁的User.find(1),效果完全一样 // let data = await User.find(1) // 可选:处理用户不存在的情况 if (!data) { return response.status(404).json({ message: 'User not found' }) } console.log(data) return response.status(200).json(data) })
另一种写法:用.then()链式处理Promise
如果你习惯Promise的链式调用,也可以这样写:
Route.get('/usertest', ({ response }) => { const User = use('App/Models/User') return User.find(1) .then(data => { if (!data) { return response.status(404).json({ message: 'User not found' }) } console.log(data) return response.status(200).json(data) }) .catch(error => { // 捕获数据库查询可能出现的错误 return response.status(500).json({ error: error.message }) }) })
补充提醒
不管用哪种写法,都建议加上错误处理逻辑:比如数据库连接异常、用户不存在等情况,这样接口的鲁棒性会更好。
内容的提问来源于stack exchange,提问作者Akshay Khale
相关产品推荐
相关产品推荐

