Javascript 奇怪的登录错误导致服务器崩溃-AngularJS/MEAN stack

Javascript 奇怪的登录错误导致服务器崩溃-AngularJS/MEAN stack,javascript,angularjs,mean-stack,Javascript,Angularjs,Mean Stack,我是AngularJS的新手程序员,我的登录功能有一个小问题。似乎每当我键入一个不存在随机密码的用户名时,服务器就会崩溃,但如果用户名已注册且我键入了随机密码,服务器不会崩溃。 这真的很烦人,我希望你们能给我一些提示。 我会把代码贴在下面 首先,这里是服务器崩溃时的屏幕截图- server.js-控制台指向该文件中的第100行,即“bcrypt.compare(req.body.password等)”,这会使服务器崩溃 app.put('/users/signin', function

我是AngularJS的新手程序员,我的登录功能有一个小问题。似乎每当我键入一个不存在随机密码的用户名时,服务器就会崩溃,但如果用户名已注册且我键入了随机密码,服务器不会崩溃。 这真的很烦人,我希望你们能给我一些提示。 我会把代码贴在下面

首先,这里是服务器崩溃时的屏幕截图-

server.js-控制台指向该文件中的第100行,即“bcrypt.compare(req.body.password等)”,这会使服务器崩溃

    app.put('/users/signin', function (req, res, next) {

    db.collection('users', function (err, usersCollection) {

        usersCollection.findOne({username: req.body.username}, function (err, user) {

            bcrypt.compare(req.body.password, user.password, function (err, result) {
                if (result) {
                    var token = jwt.encode(user, JWT_SECRET);
                    return res.json({token: token});
                } else {
                    return res.status(400).send();
                }
            });
        });
    });
});
index.html-这是我保存控制器的文件

$scope.signIn = function () {

                if ($scope.signin.$valid) {
                    $http.put('/users/signin', { username: $scope.username, password: $scope.password })
                    .then(function (res) {
                        $cookies.put('token', res.data.token);
                        $cookies.put('currentUser', $scope.username);
                        $rootScope.token = res.data.token;
                        $rootScope.currentUser = $scope.username;
                    }
                )}
                else {
                    alert('Invalid credentials. Please try again.');
                }

                    };
登录HTML代码

<div class="panel-body">
                        <br />
                        <form name="signin">
                            <div class="form-group-md">
                                <input type="text" ng-required="true" placeholder="Username" class="form-control" ng-model="username">
                            </div>

                            <br />
                            <div class="form-group">
                                <input type="password" ng-required="true" placeholder="Password" class="form-control" ng-model="password">
                            </div>
                            <br />

                            <button type="button" class="btn btn-success btn-md" ng-click="signIn()">Sign in</button>
                        </form>
                    </div>




登录

我忘了什么吗?告诉我!谢谢:)

在您从
userCollection
找到的
控制器代码中,在继续之前检查是否存在任何
错误。对
用户的存在执行相同的操作。大概是这样的:

app.put('/users/signin', function (req, res, next) {
db.collection('users', function (err, usersCollection) {
    usersCollection.findOne({username: req.body.username}, function (err, user) {
        if(err){
            console.log("Error : " + JSON.stringify(err));
        }
        if(!user){
            return res.send(404, "Invalid Username or Password.");
        }
        if(user){
            bcrypt.compare(req.body.password, user.password, function (err, result) {
                if (result) {
                    var token = jwt.encode(user, JWT_SECRET);
                    return res.json({token: token});
                } else {
                    return res.status(400).send();
                }
            });
        }
    });
});
});

userscolection.findOne({username:req.body.username}
正在返回一个空用户。
console.log(user)
在bcrypt调用之前。使用if语句修复了它。如果用户为空,将发送一个错误的请求,并使服务器保持活动状态。似乎工作正常,但如果您知道更好的方法,请共享!)昨天也是这样,谢谢!我唯一缺少的是,如果我尝试使用错误的密码登录帐户,则会显示“用户名尚未注册”消息:)忘记了一件事。就安全性而言,不建议在错误消息中指出用户名不存在或密码不正确,因此我编辑了答案以显示应发送的确切错误消息。希望这有帮助。是的,我写了一些类似的东西。再次感谢:)