#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
})