第二个用户不创建

时间:2018-10-21 15:20:49

标签: node.js sequelize.js

使用完全不同的登录名创建新用户时,显示我的错误“此登录名已经很忙。请尝试另一个。”

控制台上显示以下内容:

  

(序列化)警告:将模型属性(登录)传递到查找器中   模型用户的方法选项,但options.where对象为空。   您是否忘记在何处使用options?执行中(默认):SELECT“ id”,   从“用户”到“用户”的“登录”,“密码”,“ createdAt”,“ updatedAt”   LIMIT 1; POST / api / auth / register 409 28.183毫秒-84

“ options.where”是什么意思?

型号:

module.exports = (sequelize, Sequelize) => {
    const User = sequelize.define('users', {
        login: {
            type: Sequelize.STRING,
            required: true,
            unique: true
        },
        password: {
            type: Sequelize.STRING,
            required: true
        }
    })
    return User
}

控制器:

module.exports.register = async function(req, res) {
    const candidate = await User.findOne({
        login: req.body.login
    })

    if (candidate) {
        res.status(409).json({
            message: 'This login is already busy. Try another.'
        })
    } else {
        const salt = bcrypt.genSaltSync(10)
        const password = req.body.password
        const user = new User({
            login: req.body.login,
            password: bcrypt.hashSync(password, salt)
        })
        try {
            await user.save()
            res.status(201).json(user)
        } catch(e) {
            errorHandler(res, e)
        }
    }
}

passport.js:

const JwtStrategy = require('passport-jwt').Strategy
const ExtractJwt = require('passport-jwt').ExtractJwt
const User = require('../models/user')

const options = {
  jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(), 
  secretOrKey: process.env.SECRET_OR_KEY
}

module.exports = passport => {
  passport.use(
      new JwtStrategy(options, async (payload, done) => {
          try {
              const user = await User.findById(payload.userId).select('login id')

              if (user) {
                  done(null, user)
              } else {
                  done(null, false)
              }
          } catch(e) {
              console.log(e)
          }
      })
  )
}

1 个答案:

答案 0 :(得分:2)

options对象是模型上查询函数所期望的对象,例如findOne(即,您要传递给该函数的参数-docs)。 options.where属性是一个对象,该对象被转换为生成的SQL查询的WHERE部分。

查看您的代码,我想您想找到一个登录名等于req.body.login的用户,在这种情况下,您的代码应如下所示:

const candidate = await User.findOne({
    where: { 
        login: req.body.login
    }
})