猿问

Adonis JS 用户缺少主键值

我正在尝试将用户模型从 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!'})

    }

  }



德玛西亚99
浏览 98回答 3
3回答

繁星点点滴滴

问题是您覆盖user了user = await user.save().只需将结果存储await user.save()在新变量中即可解决问题。例如:...let saved = await user.save()let accessToken = await auth.generate(user)...

倚天杖

table.increments()需要列名作为参数 ->table.increments(name)例子 :table.increments('id').primary()

MM们

问题在于user = await user.save()true当用户保存到数据库时将返回,将其传递给auth.generate是导致该错误的原因。只需使用类似的东西let success = await user.save()并检查成功值。仅当用户已保存(为 true)时,可能才想返回令牌和 200 状态success。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答