ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

捕获/处理MySQL重复输入错误 – 使用NodeJS,PassportJS,Express,connect-flash,Heroku

2019-06-09 20:10:41  阅读:352  来源: 互联网

标签:mysql node-js heroku passport-js connect-flash


我正在为节点应用程序进行用户注册,从this示例开始,但是使用MySQL数据库而不是MongoDB. users表中的多个列具有唯一性约束.

以下是创建表的SQL代码:

CREATE TABLE `' + dbconfig.database + '`.`' + dbconfig.users_table + '` ( \
    `id`                  INT UNSIGNED NOT NULL  AUTO_INCREMENT, \
    `username`            VARCHAR(60)  NULL, \
    `password`            CHAR(60)     NULL, \
    `facebook_id`         VARCHAR(60)  NULL, \
    `facebook_token`      CHAR(223)    NULL, \
    `facebook_name`       VARCHAR(100) NULL, \
    `facebook_email`      VARCHAR(100) NULL, \
    `google_id`           VARCHAR(60)  NULL, \
    `google_token`        CHAR(67)     NULL, \
    `google_name`         VARCHAR(100) NULL, \
    `google_email`        VARCHAR(100) NULL, \
    PRIMARY KEY (`id`), \
    UNIQUE INDEX `id_UNIQUE` (`id` ASC), \
    UNIQUE INDEX `username_UNIQUE` (`username` ASC), \
    UNIQUE INDEX `facebook_id_UNIQUE` (`facebook_id` ASC), \
    UNIQUE INDEX `facebook_token_UNIQUE` (`facebook_token` ASC), \
    UNIQUE INDEX `google_id_UNIQUE` (`google_id` ASC), \
    UNIQUE INDEX `google_token_UNIQUE` (`google_token` ASC) \
)');

当用户在他们的个人资料页面上并尝试更新他们现有用户记录中的facebook_id时,更新可能违反唯一性约束 – 即另一个用户记录已经具有该facebook_id.

Heroku日志中反映的MySQL错误消息是:

Error: ER_DUP_ENTRY: Duplicate entry 'xxxxxxxxxxxxxxxxx' for key 'facebook_id_UNIQUE'

(我已将x替换为实际的facebook_id.)

除了返回用户已经访问的页面(他们的个人资料页面)并显示错误消息“Facebook ID已注册到其他用户”之外,我什么都不做.我试图使用connect-flash模块来显示消息.这在该计划的其他地方有效.

我试图按如下方式完成此任务:

if (err) {
    console.log("mylog : facebook connect error");
    if (err.code === 'PROTOCOL_CONNECTION_LOST') {
        //handle disconnect
    } else if (err.code === 'ER_DUP_ENTRY') {
        console.log("mylog : fb ER_DUP_ENTRY detected");
        // release connection created with pool.getConnection
        if (connection) connection.release();
        // req.flash to set flashdata using connect-flash
        return done(err, false, req.flash('loginMessage', 'Facebook ID registered to another user.')); 
    } else { //continue }

在profile.ejs页面上,我有以下内容:

<% if (message.length > 0) { %>
    <div class="alert alert-danger"><%= message %></div>
<% } %>

此代码正在处理其他.ejs页面.

在ER_DUP_ENTRY错误的情况下,上面显示的两个console.log语句都在注册,因此程序正在成功检测到ER_DUP_ENTRY错误,但是没有像我希望的那样返回profile.ejs页面,配置文件页面消失了很多文本显示在浏览器中,从以下开始:

Error: ER_DUP_ENTRY: Duplicate entry 'xxxxxxxxxxxxxxxxx' for key 'facebook_id_UNIQUE' at Query.Sequence._packetToError 

该应用程序不会崩溃,用户仍然可以在浏览器中输入主页URL,并且一切正常.

什么出了什么问题?如何处理此错误,以便用户只在配置文件页面上看到connect-flash消息?

解决方法:

也许它已经晚了3年但是我离开了答案,迟到总比没有好!

   if(err){  //we make sure theres an error (error obj)

        if(err.errno==1062){   
        req.flash('message','The entry already exist.'); //we send the flash msg
        return res.redirect('/admin/userPanel');
        db.end();
        }
        else{
            throw err;
        db.end();
        }
}

errorno是您正在寻找的属性,当我使用console.log(错误)将错误打印到控制台时,我得到了它.

在这里,您可以检查所有错误编号https://dev.mysql.com/doc/refman/5.5/en/error-messages-server.html

很高兴!祝你读下这个好心灵的下一个好运.

标签:mysql,node-js,heroku,passport-js,connect-flash
来源: https://codeday.me/bug/20190609/1207263.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有