如何在node.js和expressJs

时间:2018-03-12 12:37:20

标签: javascript php node.js express express-session

我正在开发node.js中的app并使用expressJs,但我是 PHP 开发人员,我知道在 PHP 中我们可以使用session实现登录,我想在node.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呈现login.ejs模板,/routes/login_api处理登录页面的请求和响应, /routes/Index_api/routes/Index_api(这是我的信息中心),也是一样的。这是`login_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 个答案:

答案 0 :(得分:1)

您需要了解Node.js的异步和非阻塞特性。当您致电conn.query时,流程不会阻止并转到下一个console.log语句(回调之外)。很可能还没有调用回调。当resulterror可用时,将在任意时间调用回调。这就是你看到“怪异”行为的原因。 执行顺序不一定是语句的顺序

快速解决方案:

我建议Passport。它很受欢迎,易于使用来处理身份验证。

您可以将其用作更干净的中间件,只需通过请求上下文中提供的req.user即可访问当前用户。它具有不同的身份验证策略,包括OAuth,并且易于使用。

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

在您的特定应用中,请参阅:

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

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