NodeJS会话,cookie和mysql

时间:2013-03-06 20:05:59

标签: mysql node.js session

我正在尝试构建一个auth系统,我有app.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);

和route.index为

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 个答案:

答案 0 :(得分:2)

为什么不只是使用Express的会话处理?如果您使用快速命令行工具express --sessions,它将创建具有会话支持的项目模板。从那里,您可以将会话行复制到当前项目中。 How do sessions work in Express.js with Node.js?中有更多信息(看起来可能是重复的)

至于清理SQL,您似乎正在使用该库,如果您使用参数化查询(即,占位符),它将会限制您的输入。

最后,你使用Express错误(没有冒犯)。 Express的路由器将允许您分割很多路线(以及允许您配置favicon。请参阅Unable to Change Favicon with Express.js(第二个答案)。 使用'/ *'路由只会捕获所有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,它将返回会话消息(如果存在),否则它将告诉您该会话不存在。

答案 1 :(得分:0)

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

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

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