捕捉/处理MySQL重复input错误 – 使用NodeJS,PassportJS,Express,连接闪存,Heroku

我正在做一个节点应用程序的用户注册,从这个例子开始,但是使用MySQL数据库而不是MongoDB。 用户表中的多列具有唯一性约束。

这是创build表的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) \ )'); 

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

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

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

(我已经用实际的facebook_id代替了x。)

除了返回到用户已经在的页面(他们的个人资料页面)并且显示错误消息“Facebook ID注册给另一个用户”之外,我不想做任何事情。 我正在尝试使用连接闪存模块来显示消息。 这是在该计划的其他地方工作。

我正试图做到这一点如下:

 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 

该应用程序不会崩溃,用户仍然可以在浏览器中input主页的URL,事情照常工作。

任何想法出了什么问题? 我如何处理这个错误,以便用户只能看到在configuration文件页面上的连接闪光消息?