简体   繁体   中英

i am trying to add multiple users on a atlas mongoDB

I have created a rest api and I am trying to add multiple users to atlas mongodb I use this schema

const mongoose = require('mongoose');
const { v1: uuidv1 } = require('uuid');
const crypto = require('crypto')

const userSchema = new mongoose.Schema({
    // _id: mongoose.Types.ObjectId, 
    name: {
        type: String,
        // trim: true,
        unique: true,
        required: true,
        index: true
  
    },
    email: {
        type: String,
        // trim: true,
        required: true,
        unique: true,
    },
    hashed_password: {
        type: String,
        trim: true,
        required: true
    },
    salt: String,
    created: {
        type: Date,
        default: Date.now
    },
    updated: Date,
    
})


// VIRTUAL FIELD
userSchema.virtual('password')
    .set(function(password){
        //create temporary variable called _password
        this._password = password
        //generate a timestamp
        this.salt = uuidv1();
        //encryptPassword
        this.hashed_password = this.encryptPassword(password)
    })
    .get(function(){
        return this._password
    })

///methods 
userSchema.methods = {
    authenticate: function(plainText){
        return this.encryptPassword(plainText) === this.hashed_password
    },

    encryptPassword : function(password){
        if(!password) return "";
        try{
            return crypto.createHmac('sha256', this.salt)
            .update(password)
            .digest('hex');
        } catch(err){
            return ""
        }
    }
}

module.exports = mongoose.model('User', userSchema);

I use this function to sign up :

exports.signup = async (req, res) => {
    const userExists = await User.findOne({email : req.body.email})
    if(userExists) return res.status(403).json({
        error: "EMAIL is TAKEN"
    })
    const user = await new User(req.body)
    await user.save()
        .then(result => {res.json({result: result})})
        .catch(err => res.json({err : err}))
}

I validate :

exports.userSignupValidator = (req, res, next) => {
    //name is not null and its between 4 and 10 characters
    req.check('name', 'name is required').notEmpty();
    //email is not null, valid and NORMALIZED -> we will use method chaining
    req.check('email', 'please enter valid email')
        .matches(/.+\@.+\..+/)
        .withMessage('email must contain @')
        .isLength({
            min: 4,
            max: 2000
        })

    //check for password
    req.check('password', 'Password is required').notEmpty();
    req.check('password').isLength({
        min: 6,
    }).withMessage('password must be minimum 6 char long').matches(/\d/).withMessage('must contain a number')
    //check for errors
    const error = req.validationErrors()

    ////////if error apears show the first one as they appear
    if(error){
        const firstError = error.map((error) => error.msg)[0]
        return res.status(400).json({error: firstError})
    }

    ////proceed to next middleware
    next()
}

and I use the route :

const express = require('express'); //bring in express 
const postController = require('../controlers/postControler')  //brings everything that is exported from the postControler FILE and becomes a OBJECT
const router = express.Router();
const validator = require('../validator');
const signup = require('../controlers/authControler');
const userById = require('../controlers/userControler');

router.get('/',  postController.getPosts)
router.post('/post', signup.requireSignIn, validator.createPostValidator, postController.createPost)
router.get('/test' , postController.test)
router.post('/signup', validator.userSignupValidator, signup.signup)
router.post('/signin', signup.signin)
router.get('/signout', signup.signout)
router.get('/lahoha', userById.getUsers)
////find the user by id with params 
////any routes containing :userId our app will first execute userById()
router.param('userId', userById.userById);
///////////////////////////////////////////////
module.exports = router

the problem is when I try to create a second user with postman with :

{
    "name": "petru",
    "email": "petru@gmail.com",
    "password": "notazece10"
}

I get the error :

{
    "err": {
        "driver": true,
        "name": "MongoError",
        "index": 0,
        "code": 11000,
        "keyPattern": {
            "username": 1
        },
        "keyValue": {
            "username": null
        }
    }
}

Please help !!!!! this error is driving me crazy, I don't know what I'm doing wrong

after running thru my code multiple times line by line i found out the code is fine , the problem was in my atlas mongodb database. So i am new to nodejs and mongo , and i try to learn , when i created my first mongodb database in atlas i did not pay attention to naming my database so it had the default name of . I went back to atlas mongodb and i made a new database ( cluster) , named it TEST , copied the link, went into my dotenv file paste the link to my MONGO_URI restarted the server and then all code worked fine now i can add as many users as i want. I hope other newcomers to mongodb and nodejs learn from my mistake and if someone ever repeats my STUPID mistake i hope they find this and fix it.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM