提问者:小点点

NodeJS会话、cookies和mysql


我正试图建立一个认证系统,我有一个应用程序。js

var express = require('express')
  , MemoryStore = require('express').session.MemoryStore
  , app = express();

app.use(express.cookieParser());
app.use(express.session({ secret: 'keyboard cat', store: new MemoryStore({ reapInterval: 60000 * 10 })}));
app.use(app.router);

还有路线。索引为

var express = require('express')
  , mysql = require('mysql')
  , crypto = require('crypto')
  , app = module.exports = express();

app.get('/*',function(req,res){
    var url = req.url.split('/');
    if (url[1] == 'favicon.ico')
        return;

    if (!req.session.user) {
        if (url.length == 4 && url[1] == 'login') {     
            var connection = mysql.createConnection({
                host     : 'localhost',
                user     : 'user',
                password : 'pass',
            });
            var result = null;
            connection.connect();
            connection.query('use database');
            var word = url[3];
            var password = crypto.createHash('md5').update(word).digest("hex");
            connection.query('SELECT id,level FROM users WHERE email = "'+url[2]+'" AND password = "'+password+'"', function(err, rows, fields) {
              if (err) throw err;
                for (i in rows) {
                    result = rows[i].level;
                }
                req.session.user = result;
            });
            connection.end();
        }
    }

console.log(req.session.user)

当我访问http://mydomain.com/login/user/pass第一次显示在最后一次控制台调用中,但第二次访问时,cookie是干净的


共2个答案

匿名用户

为什么不直接使用Express的会话处理?如果您使用Express命令行工具作为Express--session,它将创建带有会话支持的项目模板。从那里,您可以将会话行复制到当前项目中。有更多信息在会话如何工作在Express.js与Node.js?(这看起来像它可能是一个副本)

至于清理你的SQL,你似乎在使用库,如果你使用参数化查询(即?占位符)。

最后一件事,您使用的Express是错误的(没有冒犯)。Express的路由器将允许您分割许多路由(同时允许您配置favicon。请参阅无法使用Express.js更改favicon(第二个答案)。使用“/*”路由只会捕获所有GET请求,这大大限制了路由器可以为您做的事情。

(从注释中继续;把它放在这里的代码块)现在你有了一个带有会话支持的应用程序,尝试以下两种途径:

app.get('/makesession', function (req, res) {
    req.session.message = 'Hello world';
    res.end('Created session with message : Hello world');
});
app.get('/getsession', function (req, res) {
    if (typeof req.session.message == 'undefined') {
        res.end('No session');
    } else {
        res.end('Session message: '+req.session.message);
    }
});

如果您在浏览器中导航到/makesession,它将设置会话消息并通知您已设置会话消息。现在,如果导航到/getsession,它将返回会话消息(如果存在),否则它将告诉您会话不存在。

匿名用户

您需要在响应对象中保存cookie值:

res.cookie('session', 'user', result);

http://expressjs.com/api.html#res.cookie