检查用户是否已存在(Node.js和mysql)

3

我想检查数据库中是否存在某个用户。如果我在不检查是否有同名用户的情况下将其添加到数据库中,那么我的代码就能够正常工作。但是当我尝试检查时,问题出现了,因为代码可以识别用户是否存在,但如果不存在,则无法将用户添加到数据库中。以下是可行的代码(函数DB()用于创建与数据库的连接):

app.post('/Registro', function(req, res){
var conDB=DB();
var reg={
    Usuario: req.body.Usuario,
    Contra: req.body.Contra
};
console.log(req.body.Usuario+" "+req.body.Contra);
var query=conDB.query('INSERT INTO Usuario SET ?',reg,function(err, res){

});
res.send("Usuario: "+req.body.Usuario+" y Contraseña: "+req.body.Contra + "REGISTRADOS");
conDB.end(); });

以下是不工作的代码(我正在尝试检查用户是否存在):

app.post('/Registro', function(req, res){
var conDB=DB();
var reg={
    Usuario: req.body.Usuario,
    Contra: req.body.Contra
};
var UsuarioReg=req.body.Usuario;
conDB.query('SELECT * FROM Usuario WHERE Usuario = ?', UsuarioReg,function(err,rows){
    if(err)
        return console.log(err);
    if (!rows.length)
    {
            conDB.query('INSERT INTO Usuario SET ?',reg,function(err, respuesta){
            return respuesta.send("Usuario: "+req.body.Usuario+" y Contraseña: "+
                    req.body.Contra + "REGISTRADOS");
            }); 
    }
    else
    {
        return res.send("Este usuario ya existe");
    }
});
    conDB.end(); 
});

如果有人知道我如何解决这个问题,我将不胜感激!
我进行了一次编辑,但出现了这个异常: enter image description here
2个回答

4
我猜测在查询执行之前数据库连接已经关闭了。我建议将 conDB.end() 移到第一个查询的 err 处理程序和第二个查询的回调函数中。
app.post('/Registro', function(req, res){
    var conDB=DB();
    var reg={
        Usuario: req.body.Usuario,
        Contra: req.body.Contra
    };
    var UsuarioReg=req.body.Usuario;
    var ContraReg=req.body.Contra;
    conDB.query('SELECT * FROM Usuario WHERE Usuario = ? and Contra= ?',  [UsuarioReg,ContraReg]
,function(err,rows){
    if(err) {
        conDB.end();
        return console.log(err);
    }

    if (!rows.length)
    {
        conDB.query('INSERT INTO Usuario SET ?',reg,function(err, results){
            conDB.end();
            return res.send("Usuario: "+req.body.Usuario+" y Contraseña: "+
                req.body.Contra + "REGISTRADOS");
        });
    }
    else
    {
        conDB.end();
        return res.send("Este usuario ya existe");
    }
});

});

我已经修改了代码,但它仍然无法正常工作。我的做法是从将用户添加到数据库的函数中删除了部分内容,该部分内容为 return res.send("Usuario: "+req.body.Usuario+" y Contraseña: "+req.body.Contra + "REGISTRADOS")。这个函数肯定存在问题。在Node.js中,我不能两次向数据库发出请求而不关闭连接吗? - F. Riggio
你肯定可以的。你在控制台中看到第一个查询的错误吗?还是你收到了“用户已存在”的响应? - Matt Altepeter
当用户已经存在时,它会抛出一个消息告诉我它已经存在。但现在,像第一种情况一样将返回放在函数下面,这种方式运行良好,它不会抛出错误。它只是说新用户已注册,但是当我打开数据库时,它并没有出现。 - F. Riggio
你说我超载的变量是哪个?是那些在像req.body.Usuario和req.body.Contra这样的地方使用res.send函数时可以看到的变量吗? - F. Riggio
啊,我想我明白你的意思了。我现在做了这个: conDB.query('INSERT INTO Usuario SET ?',reg,function(err, respuesta){ }); 返回 res.send("用户:"+req.body.Usuario+"和密码:"+ req.body.Contra + "已注册"); - F. Riggio
显示剩余8条评论

2

感谢您的建议。这对我很有帮助。然后我可以在我的代码中创建注册路由。

            var express = require("express");
            var router = express.Router();
            //var usersModel = require("../models/users");
            var db = require("../common/database");
            var conn = db.getConnection();
            router.get("/", function (req, res) {
                res.json({ "message": "This is Admin page" });
            })
            router.get("/register_success/:email", function (req, res) {
                res.render("register_success", { email: req.params.email });
            })
            router.get("/signup", function (req, res) {
                res.render("signup", {
                    data: {
                        email: "",
                        password: "",
                        first_name: "",
                        last_name: ""
                    }, error: false, message: ""
                });
            })
            router.post('/signup', function (req, res) {
                var user = req.body;
                var Oneuser = {
                    email: user.email,
                    password: user.passwd,
                    first_name: user.firstname,
                    last_name: user.lastname,
                    created_at: new Date()
                };
                conn.query('SELECT * FROM users WHERE email = ?', [Oneuser.email]
                    , function (err, rows) {
                        if (err) {
                            conn.end();
                            console.log(err);
                            res.render("signup", {
                                data: {
                                    email: user.email,
                                    password: user.passwd,
                                    first_name: user.firstname,
                                    last_name: user.lastname
                                }, error: true, message: err
                            });
                        }
                        if (!rows.length) {
                            conn.query('INSERT INTO users SET ?', Oneuser, function (err2, results) {
                                if (err2) {
                                    console.log(err2);
                                    res.render("signup", {
                                        data: {
                                            email: user.email,
                                            password: user.passwd,
                                            first_name: user.firstname,
                                            last_name: user.lastname
                                        }, error: true, message: err2
                                    });
                                } else {
                                    res.redirect("/admin/register_success/" + Oneuser.email);
                                }
                            });
                        }
                        else {
                            console.log("Email is exists");
                            res.render("signup", {
                                data: {
                                    email: user.email,
                                    password: user.passwd,
                                    first_name: user.firstname,
                                    last_name: user.lastname
                                }, error: true, message: "Email is exists"
                            });
                        }
                    });
            });
            module.exports = router;

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