Поймать / обработать ошибку ввода дубликата MySQL - с NodeJS, PassportJS, Express, connect-flash, Heroku

Я делаю регистрацию пользователей для приложения узла, начиная с этого примера, но использую базу данных MySQL вместо MongoDB. Несколько столбцов в таблице пользователей имеют ограничение уникальности.

Вот код 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.

Сообщение об ошибке MySQL, отраженное в журнале Heroku:

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 на странице профиля?

2 ответа

Возможно, это на 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 - это свойство, которое вы ищете, я получил его, когда печатал err на консоль, используя console.log (err).

Здесь вы можете проверить все ошибки номер https://dev.mysql.com/doc/refman/5.5/en/error-messages-server.html

это было приятно! Удачи следующей доброй душе, которая прочитает это.

Довольно прямое и понятное решение: //----------------

connection.query('write your mysql query', function(err,rows){
      if(err)
      {

        if(err.code == 'ER_DUP_ENTRY' || err.errno == 1062)
        {
            console.log('Here you can handle duplication')
        }
        else{
           console.log('Other error in the query')
        }

      }else{
         console.log('No error in the query')
      }
 })
Другие вопросы по тегам