使用Nodejs和Express(node-mysql)连接Mysql数据库

10

我是node和express的新手,关于使用mysql我有一个问题。我有一个提交到“/login”的登录表单,我正在使用node-mysql模块。

 app.get('/site', function(req, res){
    if (req.session.is_logged_in === true) {
        res.render('site/start', {
            title: 'News'
        });
    } else {
        res.redirect('/');
    }
});

app.post('/login', function(req, res){
    client.query('SELECT id, user_name FROM user WHERE email="' + req.body.login + '" AND password="' + Hash.sha1(req.body.password) + '"',
        function (err, results, fields) {
            if (err) {
                throw err;
            }
            if (results[0]) {
                req.session.userInfo = results[0];
                req.session.is_logged_in = true;
                res.render('site/start', {
                    title: 'News'
                });
            }
            else {
                res.redirect('/');
            }
        }
    );
});

这是一个好的方法吗?我能继续这样做吗? SQL查询是否以某种方式进行了转义,还是必须自己编写该功能?

最后一个问题:我正在重写一个网站,并且我使用了MySQL数据库。将其更改为MongoDB是否有任何好处?

任何帮助都将不胜感激。

提前致谢。

乔治

3个回答

14

node-mysql客户端对象具有一个escape方法,可以帮助处理此问题。您可以手动调用它,或者使用接受参数的查询形式。例如:

client.query('SELECT id, user_name FROM user WHERE email=?',
    [req.body.login], ...

注意,使用参数方法并不会实际提交参数化查询到mysql,它只是为您处理参数替换和转义。

顺便说一下,这里的转义是什么:

https://github.com/felixge/node-mysql/blob/master/lib/protocol/SqlString.js#L3


以上链接现在已失效(404)。 - Brent Faust
我相信Connection.query对于使用它的人来说更有趣:https://github.com/felixge/node-mysql/blob/master/lib/Connection.js#L96 - Pijusn

10

这种方法可行吗?我可以继续这样做吗?sql查询会以某种方式转义吗,还是我需要自己编写这个功能?

首先应该对SQL查询参数进行清洗。例如,利用 node-validator 模块的功能来防止SQL注入攻击

我正在重写一个网站,使用了mysql数据库。将其更改为mongodb是否有任何好处?

总的来说,这取决于您的网站功能和其他因素。可以参考这个问题了解相关内容。


谢谢回复 :)node-validator看起来很棒,正是我在寻找的。谢谢 :) - georgesamper
2
node-mysql 也有转义功能。当然,只要你正确使用它。https://github.com/felixge/node-mysql#escaping-query-values - Pijusn

5
如果您的网站变得更加复杂,您可能会对使用ORM来处理MySQL数据感兴趣。Sequelize使用node-mysql库并管理完整的SQL事务:http://sequelizejs.com

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接