为了账号安全,请及时绑定邮箱和手机立即绑定

Adonis JS 用户缺少主键值

Adonis JS 用户缺少主键值

德玛西亚99 2023-07-06 09:57:51
我正在尝试将用户模型从 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!'})    }  }
查看完整描述

3 回答

?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

问题是您覆盖user了user = await user.save().

只需将结果存储await user.save()在新变量中即可解决问题。


例如:


...

let saved = await user.save()

let accessToken = await auth.generate(user)

...


查看完整回答
反对 回复 2023-07-06
?
倚天杖

TA贡献1828条经验 获得超3个赞

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

例子 :

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


查看完整回答
反对 回复 2023-07-06
?
MM们

TA贡献1886条经验 获得超2个赞

问题在于

user = await user.save()

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

只需使用类似的东西

let success = await user.save()

并检查成功值。仅当用户已保存(为 true)时,可能才想返回令牌和 200 状态success


查看完整回答
反对 回复 2023-07-06
  • 3 回答
  • 0 关注
  • 75 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信