MongoDB не добавляет нового пользователя после предыдущего запроса с УНИКАЛЬНЫМ реферальным кодом. Помогает только «ОБНОВИТЬ» веб-страницу MongoDB. Что я сделал не так?

#mongodb #model #schema

#mongodb #Модель #схема

Вопрос:

Auth.js (КОНТРОЛЛЕР):

 const bcrypt = require('bcryptjs')
const jwt = require('jsonwebtoken')
const User = require('../models/User')
const keys = require('../config/keys')
const errorHandler = require('../utils/errorHandler')

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

  if (candidate) {
    // user exist
    res.status(409).json({
      message: 'Email is taken. Try another one!'
    })
  } else {
    // new user
    const salt = bcrypt.genSaltSync(10)
    const password = req.body.password
    const user = new User({
      username: req.body.username,
      password: bcrypt.hashSync(password, salt),
    })

    try {
      await user.save()
      res.status(201).json(user)
    } catch(e) {
      errorHandler(res, e)
    }

  }
}
  

Auth.js (МАРШРУТЫ):

 const express = require('express')
const controller = require('../controllers/auth')
const router = express.Router()

//localhost:5000/api/auth/register
router.post('/register', controller.register)

module.exports = router
  

User.js (МОДЕЛЬ):

 const mongoose = require('mongoose')
const Schema = mongoose.Schema

const userSchema = new Schema({
  username: {
    type: String,
    unique: false
  },
  password: {
    type: String,
    required: true
  },
  codeRef: {
    type: String,
    default: makeid(6).toString(),
    unique: true
  }
})

// GENERATE RANDOM REFFERAL LINK
function makeid(length) {
   var result           = ''
   var characters       = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
   var charactersLength = characters.length
   for ( var i = 0; i < length; i   ) {
      result  = characters.charAt(Math.floor(Math.random() * charactersLength))
   }
   return result
}

module.exports = mongoose.model('users', userSchema)
  

Все работает нормально, новый пользователь успешно добавлен.
Проблема возникает с другим добавленным пользователем после первого. Сгенерированный реферальный код выдает ошибку, пока мы не обновим базу данных MongoDB или не перезапустим сервер (NPM).
(Результаты от POSTMAN)

 {
    "success": false,
    "message": "E11000 duplicate key error collection: Cluster.users index: codeRef_1 dup key: { codeRef: "DDP1SF" }"
}
  

Журналы с консоли:

 POST /api/auth/register 201 457.563 ms - 350
POST /api/auth/register 500 304.148 ms - 142
POST /api/auth/register 500 190.155 ms - 142
  

Пытался изменить const на var … Должен ли я как-то очистить данные схемы предыдущего запроса? Потому что мой сгенерированный случайный код для 6 символов остается неизменным до обновления.

Ответ №1:

МОДЕЛИ НЕ должны содержать функций, потому что они статичны. Размещение функции внутри файла КОНТРОЛЛЕРА выполнило свою работу.

 // GENERATE RANDOM REFFERAL LINK
function makeid(length) {
   var result           = ''
   var characters       = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
   var charactersLength = characters.length
   for ( var i = 0; i < length; i   ) {
      result  = characters.charAt(Math.floor(Math.random() * charactersLength))
   }
   return result
}
  

Чтобы показать ответ после обновления сервера, используйте new: true :

 const user = new User({
  username: req.body.username,
  password: bcrypt.hashSync(password, salt),
  codeRef: makeid(6).toString(),
  new: true
})