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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:09:30