Adonis JS 用户缺少主键值
Adonis JS Primary key value is missing for user
我正在尝试将用户模型从 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
table.increments()
需要列名作为参数 -> table.increments(name)
请阅读 knex 官方文档:https://knexjs.org/#Schema-increments
示例:
table.increments('id').primary()
问题在于
user = await user.save()
这将 return true
当用户保存到数据库时,将其传递给 auth.generate
是导致该错误的原因。
只需使用类似
的东西
let success = await user.save()
然后检查成功值。可能想要 return 令牌和 200 状态仅当用户被保存时(success
为真)。
问题是您覆盖了 user = await user.save()
中的 user
模型实例。
正如@Costin 所说,只需将 await user.save()
的结果存储在新变量中即可解决问题。
例如:
...
let saved = await user.save()
let accessToken = await auth.generate(user)
...
我正在尝试将用户模型从 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
table.increments()
需要列名作为参数 -> table.increments(name)
请阅读 knex 官方文档:https://knexjs.org/#Schema-increments
示例:
table.increments('id').primary()
问题在于
user = await user.save()
这将 return true
当用户保存到数据库时,将其传递给 auth.generate
是导致该错误的原因。
只需使用类似
的东西let success = await user.save()
然后检查成功值。可能想要 return 令牌和 200 状态仅当用户被保存时(success
为真)。
问题是您覆盖了 user = await user.save()
中的 user
模型实例。
正如@Costin 所说,只需将 await user.save()
的结果存储在新变量中即可解决问题。
例如:
...
let saved = await user.save()
let accessToken = await auth.generate(user)
...