Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 节点应用程序在收到重复的电子邮件地址E11000重复密钥错误时崩溃_Node.js - Fatal编程技术网

Node.js 节点应用程序在收到重复的电子邮件地址E11000重复密钥错误时崩溃

Node.js 节点应用程序在收到重复的电子邮件地址E11000重复密钥错误时崩溃,node.js,Node.js,我环顾了其他关于这个错误的问题,给出的每个答案都有点不同。因为我的代码与其他人的代码不同,所以很难识别问题。当我运行我的节点应用程序并在电子邮件字段中输入一封重复的电子邮件并继续论坛请求时,服务器崩溃并抛出此错误: BulkWriteError: E11000 duplicate key error collection: loginapp.users index: email_1 dup key: 这意味着,至少我认为这意味着我输入的电子邮件已经在数据库中使用。这是我想要的,但我宁愿它发送一

我环顾了其他关于这个错误的问题,给出的每个答案都有点不同。因为我的代码与其他人的代码不同,所以很难识别问题。当我运行我的节点应用程序并在电子邮件字段中输入一封重复的电子邮件并继续论坛请求时,服务器崩溃并抛出此错误:

BulkWriteError: E11000 duplicate key error collection: loginapp.users index: email_1 dup key:
这意味着,至少我认为这意味着我输入的电子邮件已经在数据库中使用。这是我想要的,但我宁愿它发送一条消息到页面,说“电子邮件已经存在”,而不是崩溃。我的代码在下面,任何帮助或正确方向的一点将不胜感激

我唯一的想法是可能尝试捕捉错误,然后通知用户重复。如果这是正确的做法,我不太确定如何用我目前的代码设置做到这一点

// Register
router.get('/register', function(req, res){
    res.render('register');
});

// Login
router.get('/login', function(req, res){
    res.render('login');
});

// Register User
router.post('/register', function(req, res){
    var firstname = req.body.firstname;
    var lastname = req.body.lastname;
    var email = req.body.email;
    var username = req.body.username;
    var password = req.body.password;
    var password2 = req.body.password2;

    // Validation
    req.checkBody('firstname', 'First Name is required').notEmpty();
    req.checkBody('lastname', 'Last Name is required').notEmpty();
    req.checkBody('email', 'Email is required').notEmpty();
    req.checkBody('email', 'Email is not valid').isEmail();
    req.checkBody('username', 'Username is required').notEmpty();
    req.checkBody('password', 'Password is required').notEmpty();
    req.checkBody('password2', 'Passwords do not match').equals(req.body.password);

    var errors = req.validationErrors();

    if(errors){
        res.render('register',{
            errors:errors
        });
    } else {
        var newUser = new User({
            firstname: firstname,
            lastname: lastname,
            email:email,
            username: username,
            password: password
        });

        User.createUser(newUser, function(err, user){
            if(err) throw err;
            console.log(user);
        });

        req.flash('success_msg', 'You are registered and can now login');

        res.redirect('/users/login');
    }
});

passport.use(new LocalStrategy(
  function(username, password, done) {
   User.getUserByUsername(username, function(err, user){
    if(err) throw err;
    if(!user){
        return done(null, false, {message: 'Unknown User'});
    }

    User.comparePassword(password, user.password, function(err, isMatch){
        if(err) throw err;
        if(isMatch){
            return done(null, user);
        } else {
            return done(null, false, {message: 'Invalid password'});
        }
    });
   });
  }));

passport.serializeUser(function(user, done) {
  done(null, user.id);
});

passport.deserializeUser(function(id, done) {
  User.getUserById(id, function(err, user) {
    done(err, user);
  });
});

router.post('/login',
  passport.authenticate('local', {successRedirect:'/', failureRedirect:'/users/login',failureFlash: true}),
  function(req, res) {
    res.redirect('/');
  });

router.get('/logout', function(req, res){
    req.logout();

    req.flash('success_msg', 'You are logged out');

    res.redirect('/users/login');
});

module.exports = router;
App.js

// Connect Flash
app.use(flash());

// Global Vars
app.use(function (req, res, next) {
  res.locals.success_msg = req.flash('success_msg');
  res.locals.error_msg = req.flash('error_msg');
  res.locals.error = req.flash('error');
  res.locals.user = req.user || null;
  next();
});

您已经在MongoDB用户集合上创建了一个唯一的索引,这就是mongo将抛出此错误的原因,并且没有办法轻松覆盖mongoose功能,因此您必须在代码中处理它

在您的代码中,您正在抛出错误,但并没有在任何地方处理错误,这就是它崩溃的原因

User.createUser(newUser, function(err, user){
    if(err) throw err;  // <== this line
    console.log(user);
});

您已经在MongoDB用户集合上创建了一个唯一的索引,这就是mongo将抛出此错误的原因,并且没有办法轻松覆盖mongoose功能,因此您必须在代码中处理它

在您的代码中,您正在抛出错误,但并没有在任何地方处理错误,这就是它崩溃的原因

User.createUser(newUser, function(err, user){
    if(err) throw err;  // <== this line
    console.log(user);
});
在代码中,抛出一个错误。不要抛出错误,而要抛出句柄 以正确的方式在代码中删除错误,以防止服务器崩溃

所以像这样处理

 User.createUser(newUser, function(err, user) {
     if (err) {
         if (err.code == 11000 && err.message.indexOf('users.$phoneNo_1') > -1) {

             // your custom logic here

         } else if (err.code == 11000 && err.message.indexOf('users.$email_1') > -1) {

             // your custom logic here
         } else {
             // your custom logic here
         }
     } else {
         // your custom logic here
     }

 });
在代码中,抛出一个错误。不要抛出错误,而要抛出句柄 以正确的方式在代码中删除错误,以防止服务器崩溃

所以像这样处理

 User.createUser(newUser, function(err, user) {
     if (err) {
         if (err.code == 11000 && err.message.indexOf('users.$phoneNo_1') > -1) {

             // your custom logic here

         } else if (err.code == 11000 && err.message.indexOf('users.$email_1') > -1) {

             // your custom logic here
         } else {
             // your custom logic here
         }
     } else {
         // your custom logic here
     }

 });


这将帮助我绕过错误的崩溃。但是,这难道不会绕过我不想注册重复的电子邮件地址这一事实吗?当输入重复的电子邮件地址时,我希望它捕获该错误并输出“电子邮件已在使用”以将用户返回/注册。此外,我编辑了上面的代码以显示app.js文件的一部分,我已经实现了类似的功能。是的,您必须编写逻辑来检查其电子邮件错误还是其他错误,然后将错误与自定义消息一起抛出,并编写一个映射文件以将错误代码与用户友好的消息映射。编辑答案,给你一个基本的想法。谢谢你的帮助。编辑后的答案你需要这样做,你可以更改流程,但这样做可以让你显示错误,优点是你可以在整个应用程序中使用常见错误界面。这将帮助我绕过错误导致的崩溃。但是,这难道不会绕过我不想注册重复的电子邮件地址这一事实吗?当输入重复的电子邮件地址时,我希望它捕获该错误并输出“电子邮件已在使用”以将用户返回/注册。此外,我编辑了上面的代码以显示app.js文件的一部分,我已经实现了类似的功能。是的,您必须编写逻辑来检查其电子邮件错误还是其他错误,然后将错误与自定义消息一起抛出,并编写一个映射文件以将错误代码与用户友好的消息映射。编辑答案,给你一个基本的想法。谢谢您的帮助。编辑后的答案您需要这样做,您可以更改流程,但这样做将有助于您显示错误,优点是您可以在整个应用程序中使用常见错误界面。我可以试试。@JimBob101如果您有任何问题,请告诉我。晚上上床睡觉,我明天会再看更多。@JimBob101如果你认为这对你有用,请接受答案。我可以试试。@JimBob101如果你有任何问题,请告诉我。晚上上床睡觉,明天我会更仔细地研究它。@JimBob101如果你认为它对你有用,请接受答案