【问题标题】:Node.js - Check if user existsNode.js - 检查用户是否存在
【发布时间】:2017-06-21 22:07:56
【问题描述】:

我正在使用 NodeJS 和护照让用户创建一个帐户,然后才能看到他们刚刚参加的测验的结果。我的挑战是我需要在页面刷新之前确认用户名可用,因为如果发生这种情况,用户将丢失他们的结果。

再次:我需要在刷新之前验证用户名未被占用。

我想我已经接近了,但它不起作用。我将如何更改我的代码来应对这一挑战?

目前,如果使用用户名,它会在尝试创建帐户时返回错误,并且用户最终会进入 /failpage,如下所示。

app.post('/quiz', usernameToLowerCase, emailToLowerCase, function(req, res) {


    User.findOne({
        username: req.body.username
    }, function(err, user) {
        if (err) {
            alert(err)
            if (user) {
                alert('this username is already taken. Please choose another.')
                console.log('there was a user');
                return false;

            }
        }
    });

    var user = new User({
        username: req.body.username,
        email: req.body.email,
        password: req.body.password,
    })



    user.save(function(err) {
        console.log('this is the problem' + ' ' + err)
        if (err) {
            return res.redirect('/failpage')
        }


        req.logIn(user, function(err) {
            if (err) {
                console.log(err);
            }
            console.log('all looks good')
            res.redirect('/results');
        });
    });
});

【问题讨论】:

  • 需要在回调中运行
  • 感谢@SLaks。在 user.save 回调中?
  • 请格式化您的代码以使其可读。如果您让我们更容易阅读/理解您的代码,您更有可能获得帮助。
  • 另外,当名称已经存在于数据库中时,您希望发生什么?您要发送什么类型的响应。你不能在你的服务器上做alert()
  • 我想在屏幕上通知用户,让他们在不刷新页面的情况下重试。

标签: node.js mongodb express authentication passport.js


【解决方案1】:

如果其他人试图做同样的事情,请用这个解决它:

在 app.js 中

app.get('/usercheck', function(req, res) {
    User.findOne({username: req.query.username}, function(err, user){
        if(err) {
          console.log(err);
        }
        var message;
        if(user) {
          console.log(user)
            message = "user exists";
            console.log(message)
        } else {
            message= "user doesn't exist";
            console.log(message)
        }
        res.json({message: message});
    });
});

在js中

 $('#usercheck').on('change', function() {
    $.get('/usercheck?username='+$('#usernameValue').val().toLowerCase(), function(response) {  
    $('#usernameResponseHidden').text(response.message)
    if ($('#usernameResponseHidden').html() === "user exists"){
        $('#usernameResponse').text('That username is taken. Please pick another')
    }

【讨论】:

    【解决方案2】:

    为了解决您的问题,我认为您需要路由。至少一个 app.get('/quiz') 返回一个布尔值,如果用户存在与否。 User.findOne 部分可以改为在该路由中发送。您只需要在表单的用户名字段失去焦点时使用 ajax 发出请求,并在名称可用或不可用时显示通知。

    【讨论】:

    • 感谢您的帮助!你有机会给我举个例子吗?另外我怎么打get路线?我要制作表格吗?
    猜你喜欢
    • 1970-01-01
    • 2013-07-15
    • 2018-06-10
    • 2012-11-06
    • 2014-11-18
    • 2017-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多