新用户在检查了唯一的电子邮件和用户名后不会保存到MongoDB中

问题描述 投票:0回答:1

我是网络开发领域的新手。我想创建一个“用户注册和登录”应用程序。但是我无法在注册点将唯一的用户信息保存到MongoDB中。这是我的代码...

型号:

    const mongoose = require('mongoose');
    // User Schema
    const UserSchema = mongoose.Schema( {
       name: { type: String, required: true },
       email: { type: String, required: true, unique: true },
       username: { type: String, required: true, unique: true },
       password: { type: String, required: true }
    } );
    const User = module.exports = mongoose.model( 'User', UserSchema );

Controller:

    const express = require('express');
    const router = express.Router();
    const passport = require('passport');
    const bcrypt = require('bcryptjs');
    const Users = require('../models/userModel');

    // post route for Register Process
    router.post( '/register', ( req, res ) => {
       const name = req.body.name;
       const email = req.body.email;
       const username = req.body.username;
       const password = req.body.password;
       const confirmPassword = req.body.confirmPassword;

       // Check email or username already exists in DB
       Users.find( { $or: [ {email: email}, {username: username} ] }, ( err, users ) => {
          if( err ){ return console.log( err ); }
          else{
             // If email or username already exists in DB
             if( users ){
                if( users.length > 0 ){
                   for( let i = 0; i < users.length; i++ ){
                      let hasEmail = ( users[i].email == email );
                      let hasUsername = ( users[i].username == username );
                      if( hasEmail ){
                         return console.log( 'Email already registered.' );
                      }
                      else if( hasUsername ){
                         return console.log( 'Username already taken.' );
                      }
                   }
                }
             }
             else{

                // If email or username is unique / not exists in DB
                // then save / create a new user
                let newUser = new Users( {
                   name: name,
                   email: email,
                   username: username,
                   password: password,
                   confirmPassword: confirmPassword
                } );

                // Password hashing
                bcrypt.genSalt( 10, ( err, salt ) => {
                   bcrypt.hash( newUser.password, salt, ( err, hash ) => {
                      if( err ){ return console.log( err ); }
                      newUser.password = hash;

                      // New user save in DB / create a new user
                      newUser.save( ( err ) => {
                         if( err ){
                            return console.log( err );
                         } else{
                            return console.log( 'You have registered successfully' );
                         }
                      } );
                   } );
                } );
             }
          }
       } );
    } );
    module.exports = router;

所有代码(带有服务器)都可以。如果输入emailusername,则DB中已经存在任何人,然后会收到error消息。但是,如果值是唯一的,则newUser.save()不会触发(不保存到DB中),并且不会在控制台或浏览器中显示任何error消息,即页面连续加载。在这里,我使用$or: [ {email: email}, {username: username} ]通过emailusername查找现有用户。

如何解决此问题?请帮帮我。

node.js mongodb express mongoose bcrypt
1个回答
0
投票

当没有匹配项时,find()返回[],因此,如下修改代码:

删除if( users ){并直接检查长度

 if( users.length > 0 ){
//do stuff for existing user
 } else {
      let newUser = new Users( {
       name: name,
       email: email,
       username: username,
       password: password,
       confirmPassword: confirmPassword
     } );

//save function
}

在您的情况下,始终会满足您的if( users),并且不会执行会触发elsesave部分>


0
投票

我相信是因为此行if( users ) {}。即使您提供唯一的电子邮件和密码,users也将是一个空数组。在这种情况下:

© www.soinside.com 2019 - 2024. All rights reserved.