我正在开发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
结果。
所以任何建议都请帮助我
答案 0 :(得分:1)
您需要了解Node.js的异步和非阻塞特性。当您致电conn.query
时,流程不会阻止并转到下一个console.log
语句(回调之外)。很可能还没有调用回调。当result
或error
可用时,将在任意时间调用回调。这就是你看到“怪异”行为的原因。 执行顺序不一定是语句的顺序。
快速解决方案:
我建议Passport。它很受欢迎,易于使用来处理身份验证。
您可以将其用作更干净的中间件,只需通过请求上下文中提供的req.user
即可访问当前用户。它具有不同的身份验证策略,包括OAuth,并且易于使用。
注意:它需要会话和cookie解析器。
在您的特定应用中,请参阅:
LocalStrategy
从数据库加载用户详细信息; de/serializeUser
用于从会话中读取和写入用户数据; 您还需要use
passport.initialize()
和passport.session()
个中间件。有关如何使用它的详细信息,请参阅项目页面。