Javascript 一种基于节点方式的用户登录系统

Javascript 一种基于节点方式的用户登录系统,javascript,node.js,login,callback,Javascript,Node.js,Login,Callback,如何以节点方式编写简单的用户登录系统,并进行回调? 我试图用node编写一个简单的登录验证脚本,但node的异步回调方法对我来说还没有成功。我将展示我糟糕透顶的简单登录系统脚本,这样你就可以看到我对这个概念的迷茫。我只是想了解异步执行此操作的概念 资源: 我正在使用express和节点mysql 我设置了一个索引和4个简单模块:登录、服务器、验证器和数据库连接。以下是应用程序来源: 这是我的登录模块,在这里我的问题变得很明显: console.log('login module initial

如何以节点方式编写简单的用户登录系统,并进行回调?

我试图用node编写一个简单的登录验证脚本,但node的异步回调方法对我来说还没有成功。我将展示我糟糕透顶的简单登录系统脚本,这样你就可以看到我对这个概念的迷茫。我只是想了解异步执行此操作的概念

资源:

我正在使用express和节点mysql

我设置了一个索引和4个简单模块:登录、服务器、验证器和数据库连接。以下是应用程序来源:

这是我的登录模块,在这里我的问题变得很明显:

console.log('login module initialized');

var express     = require('express');
var app         = express();
var validator   = require('./validator');

var username;
var password;

function loginSucceed(){
    res.writeHead(302, {'Location': 'http://localhost/officeball/app.php'});
    console.log('user ' + req.body.email + ' logged in successfully.');
    res.end();
}

function loginFail(){
    res.writeHead(302, {'Location': 'http://localhost/officeball'});
    console.log('user ' + req.body.email + ' failed to validate.');
    res.end();
}

function listen(){
    app.use(express.bodyParser());

    app.post('/login', function(req, res) {
        console.log('User ' + req.body.email + ' is attempting login...');
        username = req.body.email;
        password = req.body.password;
        validator.validate(username,password,callback); 
    });

    app.listen(8080, function() {
        console.log('Server running at http://127.0.0.1:8080/');
    });
}

exports.listen = listen;

listen(),但我认为我的方法并不正确。

也许你需要使用已经创建的解决方案-

一个温和的建议:你需要放慢速度,阅读你得到的更全面的答案,并做更多的研究

看看我在给你的关于这个问题的报告中提供的代码,你复制、粘贴,然后以一种破坏性的方式修改了这些代码

            if (rows[0].password === password) {
                // you would probably want a more useful callback result than 
                // just returning the username, but again - an example
                return callback(null, rows[0].username);
            } else {
                return callback(new Error ('Bad Password'), null);
            }
您已将此更改为:

            if (rows[0].password === password) {
                loginSucceed();
            } else {
                loginFail();
            }
我不确定是什么促使您从代码中删除回调

使用我发布的代码,您可以将代码更改回我最初给您的代码,然后将您在本问题中发布的代码中的行更改为:

validator.validate(username,password,callback);
致:

更新以说明如何通过闭包访问res/req

由于您真正使用的是
loginFail()
loginsuceed
,因此您可以通过这种方式重写您拥有的内容。在这种情况下,您不需要担心将req和res传递给函数,因为它们可以通过闭包获得。为了简洁起见,我内联了username/pass参数

function myLoginHandler (req, res) {
    // define your functions within the myLoginHandler scope

    function loginSucceed(){
        res.writeHead(302, {'Location': 'http://localhost/officeball/app.php'});
        res.end();
    }
    function loginFail(){
        res.writeHead(302, {'Location': 'http://localhost/officeball'});
        res.end();
    }
    // and call them the same you did
    validator.validate(req.body.email, req.body.password ,function(err,result){
        if (err) loginFail();
        else loginSucceed();
    });
}
// then you just register your function as the /login handler.
function listen(){
    app.use(express.bodyParser());
    app.post('/login', myLoginHandler);
    app.listen(8080, function() {
        console.log('Server running at http://127.0.0.1:8080/');
    });
}

你可以使用代码共享,我会用1秒@在我看来,我建议,在一个人了解如何使用工具集之前,向一个问题抛出库除了最直接的情况外,没有任何帮助——这就是你看到人的原因(例如)为一个函数加载jQuery实际上只是javascript的一行,他们应该花时间进行推理。登录用例,以最简单的形式,是一个很好的学习工具。我的意思是“使用”=获取代码并了解它是如何工作的。我认为topic starter当前的代码有一些主要缺陷——没有会话持久性和输入数据的验证,因此最好了解在80%的生产就绪应用程序中使用的解决方案中是如何实现的。所以,我发送了passportjs Framework的链接,我100%同意。在我最初对OP的回答中,我的最后一行建议签出一些node github项目。如果您认为有帮助,我将查看这些源代码。高级JS程序员的代码经常让我对他们使用的巧妙语法用法和快捷方式感到困惑。这就像在学了一个月的法语后,我试图阅读法语诗歌。对,当我试图结合你在第一个问题中提供的验证脚本时,我搞糊涂了,没有找到正确的方法来使用回调。我会放慢速度,但我发现,一旦我从几个不同的角度提出问题,学习新的代码概念总是很快发生的。非常感谢。这里的一个主要问题是缺乏使用javascript的经验。我已经看过文件了。只是掌握回调的概念,而不是过程返回。不客气。虽然它根本不是特定于节点的,但我强烈推荐道格拉斯·克罗克福德的《Javascript:好的部分》以及你可以在Youtube上从他那里找到的一些讲座(我记得他在YUI会议上做了一系列很好的讲座)。使用Javascript需要了解的其他三件事情可能是:a)它是一种函数式语言(即函数是一类对象)和b)闭包(与作用域内变量的可访问性相关)和c)JS的原型(vs class-ical)继承的方法。看着你们这些有经验的程序员像写诗一样把它写出来。。我正在努力。我会看一看,也会读这本书随着我的深入,它可能会更有意义。哦,问题:我如何将
res
对象传递给我的success/fail函数?我可以把它作为一个参数传入吗?按原样获取引用错误。确定。这是一种方法。我将编辑答案以说明另一种方法。
function myLoginHandler (req, res) {
    // define your functions within the myLoginHandler scope

    function loginSucceed(){
        res.writeHead(302, {'Location': 'http://localhost/officeball/app.php'});
        res.end();
    }
    function loginFail(){
        res.writeHead(302, {'Location': 'http://localhost/officeball'});
        res.end();
    }
    // and call them the same you did
    validator.validate(req.body.email, req.body.password ,function(err,result){
        if (err) loginFail();
        else loginSucceed();
    });
}
// then you just register your function as the /login handler.
function listen(){
    app.use(express.bodyParser());
    app.post('/login', myLoginHandler);
    app.listen(8080, function() {
        console.log('Server running at http://127.0.0.1:8080/');
    });
}