MrGobus
@MrGobus
Иван

Как правильно вызывать исключения в обработчике запросов mysql в express.js?

Генерация исключения внутри обработчика запроса mysql вышибает сервер на express напрочь.

router.get('/user/:userId', (req, res) => {
  // let sid = req.query.sid
  const {db} = req.app.locals;

  db.query('SELECT * FROM `users` WHERE `id`=' + req.params.userId, (error, results, fields) => {
    if (error) {
      throw error
    }
    if (results.length) {
      res.send(results)
    } else {
      throw new Error("User not found.")
    }
  })

})


Вылетает со следующей ошибкой.

D:\Project\vopen\server\node_modules\mysql\lib\protocol\Parser.js:437
      throw err; // Rethrow non-MySQL errors
      ^

Error: User not found.
    at Query.db.query (D:\Project\vopen\server\routers\users\index.js:16:11)
    at Query.<anonymous> (D:\Project\vopen\server\node_modules\mysql\lib\Connection.js:525:10)
    at Query._callback (D:\Project\vopen\server\node_modules\mysql\lib\Connection.js:491:16)
    at Query.Sequence.end (D:\Project\vopen\server\node_modules\mysql\lib\protocol\sequences\Sequence.js:83:24)
    at Query.ErrorPacket (D:\Project\vopen\server\node_modules\mysql\lib\protocol\sequences\Query.js:90:8)
    at Protocol._parsePacket (D:\Project\vopen\server\node_modules\mysql\lib\protocol\Protocol.js:291:23)
    at Parser._parsePacket (D:\Project\vopen\server\node_modules\mysql\lib\protocol\Parser.js:433:10)
    at Parser.write (D:\Project\vopen\server\node_modules\mysql\lib\protocol\Parser.js:43:10)
    at Protocol.write (D:\Project\vopen\server\node_modules\mysql\lib\protocol\Protocol.js:38:16)
    at Socket.<anonymous> (D:\Project\vopen\server\node_modules\mysql\lib\Connection.js:91:28)


Перерыл все, что можно было перерыть, нигде ничего нет по этой теме.
Как быть, как правильно обрабатывать ошибки в запросах mysql?
  • Вопрос задан
  • 152 просмотра
Пригласить эксперта
Ответы на вопрос 1
h0w4rd
@h0w4rd
Python dev.
Поддерживаю ответ Антона Швец-а, но хочу дополнить:

Все-же не стоит вообще использовать "Error"-ы где попало, десять раз стоит подумать прежде чем такое использовать.

И не менее важное: у вас в коде нет защиты от SQL инъекции, допустим злой пользователь может вместо "1" написать 1"; DROP TABLE `users`; -- и у вас пропадет табличка "users".
Поэтому лучше написать:
db.query('SELECT * FROM `users` WHERE `id`=?', [req.params.userId]...

И не забывайте, что в запросе может и не быть "userId", ведь злой пользователь может захотеть сломать логику... Все-же вот такая жизнь.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы