【问题标题】:Adonis JS Primary key value is missing for user用户缺少 Adonis JS 主键值
【发布时间】:2021-02-16 06:35:00
【问题描述】:

我正在尝试将用户模型从 adonis 迁移到 postgres,但我不断收到此错误 Primary key value is missing for user

我的模型如下所示:

class User extends Model {
  static boot () {
    super.boot()

    this.addHook('beforeSave', async (userInstance) => {
      if (userInstance.dirty.password) {
        userInstance.password = await Hash.make(userInstance.password)
      }
    })
  }

  tokens () {
    return this.hasMany('App/Models/Token')
  }
}

module.exports = User

我尝试运行的迁移是:

/** @type {import('@adonisjs/lucid/src/Schema')} */
const Schema = use('Schema')

class UserSchema extends Schema {
  up () {
    this.create('users', (table) => {
      table.increments()
      table.string('username', 80).notNullable().unique()
      table.string('email', 254).notNullable().unique()
      table.string('password', 60).notNullable()
      table.timestamps()
    })
  }

  down () {
    this.drop('users')
  }
}

module.exports = UserSchema

我尝试将primary() 添加到table.increments(),假设它正在postgre 数据库中生成自动增量ID。当我检查数据库时,有时会添加用户,但 id 从 2 到 4 等等

控制器长这样

const User = use('App/Models/User')

class UserController {
  async register({request, auth, response}) {
      const username = request.input("username")
      const email = request.input("email")
      const password = request.input("password")

      let user = new User()
      user.username = username
      user.email = email
      user.password = password

      user = await user.save()
      let accessToken = await auth.generate(user)
      return response.json({"user": user, "access_token": accessToken})
  }

  async login({request, auth, response}) {
    const email = request.input("email")
    const password = request.input("password");
    try {
      if (await auth.attempt(email, password)) {
        let user = await User.findBy('email', email)
        let accessToken = await auth.generate(user)
        return response.json({"user":user, "access_token": accessToken})
      }

    }
    catch (e) {
      return response.json({message: 'You first need to register!'})
    }
  }

    show ({ auth, params }) {
        if (auth.user.id !== Number(params.id)) {
          return "You cannot see someone else's profile"
        }
        return auth.user
    }
}

module.exports = UserController

【问题讨论】:

    标签: javascript postgresql knex.js adonis.js


    【解决方案1】:

    table.increments() 需要列名作为参数 -> table.increments(name)

    请阅读 knex 官方文档:https://knexjs.org/#Schema-increments

    例子:

    table.increments('id').primary()
    

    【讨论】:

    • 它确实可以将数据存储在数据库中,但之后会不断返回错误
    • 什么时候发生错误? (控制器方法)&你能分享你的模型文件吗
    • 我在这个问题的开头分享了文件。另外,我发现错误发生在控制器中,在保存用户后的行let accessToken = await auth.generate(user) 我决定在保存用户后不返回令牌,因此,避免错误,但我更愿意返回一个令牌...
    【解决方案2】:

    问题出在

    user = await user.save()
    

    当用户被保存到数据库时将返回true,将其传递给auth.generate是导致该错误的原因。

    只需使用类似的东西

    let success = await user.save()
    

    然后检查成功值。只有当用户被保存(success 为真)时,才可能想要返回令牌和 200 状态。

    【讨论】:

      【解决方案3】:

      问题是您覆盖了user = await user.save() 中的user 模型实例。

      正如@Costin 所说,只需将await user.save() 的结果存储在新变量中即可解决问题。

      例如:

      ...
      let saved = await user.save()
      let accessToken = await auth.generate(user)
      ...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-06-30
        • 2016-10-14
        • 2019-06-21
        • 1970-01-01
        • 2016-10-06
        • 2021-02-14
        • 1970-01-01
        • 2018-10-13
        相关资源
        最近更新 更多