代码之家  ›  专栏  ›  技术社区  ›  m.o

如何在节点中实现登录系统。js和expressJs[重复]

  •  1
  • m.o  · 技术社区  · 8 年前

    我正在节点中开发一个应用程序。js和使用expressJs,但我是 PHP 开发商,我知道 PHP 我们可以使用 session 实现登录,我在节点中思考。js案例是一样的,所以我搜索时发现 express-session 模块,我尝试以这种方式实现。 这 app.js 文件

    var express = require('express');
    var session = require('express-session');
    var bodyParser = require('body-parser');
    app.set('port', process.env.PORT || 3000);
    app.set('view engine', 'ejs');
    app.set('views', 'app/views');
    app.use(require('./routes/login_api'));
    app.use(require('./routes/login'));
    app.use(require('./routes/Index_api'));
    app.use(require('./routes/index'));
    
    var server = app.listen(app.get('port'), () => {
      console.log('Server is listening on ' + app.get('port'));
    });
    

    如你所见,我有四条不同的路线, /routes/login 呈现登录。ejs模板, /routes/login_api 处理登录页面的请求和响应, /routes/Index_api ,则, /路由/索引api (这是我的仪表板)也是这样。这是“login\u api”

    var express = require('express');
    var router = express.Router();
    var bodyParser = require('body-parser');
    var session = require('express-session');
    var mysql = require('mysql');
    var conn = mysql.createConnection({
        host: 'localhost',
        user: 'root',
        password: '',
        database: 'fmis'
    });
    conn.connect();
    
    router.use(bodyParser.urlencoded({
        extended: false
    }));
    router.use(bodyParser.json());
    router.use(session({
        secret: 'secret',
        saveUninitialized: true,
        resave: true
    }));
    router.post('/login_api', function(req, res) {
        var Username = req.body.Username;
        var Password = req.body.Password;
        var query = "SELECT `User_Id`, `User_Username`, `User_Password`, `User_Name`, `User_Last_Name`, `User_Type`,  `User_Photo`  FROM `users` WHERE `User_Deleted` = 0 AND `User_Username`='" + Username + "' AND  `User_Password` = '" + Password + "'";
    
        conn.query(query, function(err, result) {
            if (err) {
                console.error(err);
                res.end();
            } else {
                if (result.length == 1) {
                    req.session.Username = result[0].User_Username;
                    req.session.Password = result[0].User_Password;
                    req.session.UserType = result[0].User_Type;
    
                }
            }
            console.log(req.session.Username); // gives the right result
        });
        console.log(req.session.Username); // gives the undefined 
    
    });
    

    据我所知 session.Username 是一个全局变量(与PHP中的一样) 所以它应该在任何地方都可以访问,但当我在 routes/index 路由它给出未定义的结果,即使写入 console.log(req.session.Username); 在查询回调函数内部,它给出了从数据库返回的正确结果,但当我将其放在查询回调函数外部时,它给出了 undefined 后果 有什么建议请帮帮我

    1 回复  |  直到 8 年前
        1
  •  1
  •   user9461715 user9461715    8 年前

    您需要了解 异步和非阻塞 节点的性质。js。当你打电话的时候 conn.query 过程 不阻止 然后转到下一个语句 console.log (回调外部)。很可能尚未调用回调。回调将在以下任意时间调用: result error 可用。这就是为什么你会看到那种“奇怪”的行为。 执行顺序不一定是语句的顺序

    快速解决方案:

    我推荐 Passport 。它很流行,并且易于用于处理身份验证。

    您可以将其用作更干净的中间件,只需 req.user 在请求上下文中可用。它有不同的身份验证策略,包括OAuth,并且易于使用。

    注意事项 :它需要会话和cookie解析器。

    在您的特定应用程序中,请参见:

    • LocalStrategy 从数据库中加载用户详细信息;
    • de/serializeUser 用于从会话读取和写入用户数据;

    你还需要 use passport.initialize() passport.session() 中间产品。有关如何使用它的详细信息,请参见项目页面。