Как обработать ошибку ECONNRESET в nodejs?

#node.js #postgresql

#node.js #postgresql

Вопрос:

Я использую nodejs в качестве серверной части и postgres в качестве своей базы данных.Он отлично работает в течение нескольких минут после запуска сервера. Но через несколько минут происходит сбой, что приводит к следующей ошибке,

 events.js:292
      throw er; // Unhandled 'error' event
      ^

Error: read ECONNRESET
    at TCP.onStreamRead (internal/stream_base_commons.js:205:27)
Emitted 'error' event on Client instance at:
    at Connection.connectedErrorHandler (D:panda_new_1fishfarmiotnode_modulespglibclient.js:221:10)
    at Connection.emit (events.js:315:20)
    at Socket.reportStreamError (D:panda_new_1fishfarmiotnode_modulespglibconnection.js:57:10)
    at Socket.emit (events.js:315:20)
    at emitErrorNT (internal/streams/destroy.js:92:8)
    at emitErrorAndCloseNT (internal/streams/destroy.js:60:3)
    at processTicksAndRejections (internal/process/task_queues.js:84:21) {
  errno: 'ECONNRESET',
  code: 'ECONNRESET',
  syscall: 'read'
}
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! app@1.0.0 start: `node ./bin/www`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the app@1.0.0 start script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     C:UsersWelcomeAppDataRoamingnpm-cache_logs2020-09-01T11_23_58_697Z-debug.log
  

Моя строка подключения,

 var config = {
    db: {
      
        connectionString: 'postgresql://localhost'
    },
  

Мой код,

 let connectionString = config.db.connectionString;
const client = new pg.Client(connectionString);
client.connect();

router.post('/addAlert', (req, res) => {
    var sql = "SELECT public.alert_insert('["   JSON.stringify(req.body)   "]')"
    client.query(sql)
        .then(users => res.status(200).json({ message: "Created Successfully", status: 200 }))
        .catch(err => res.status(500).json({ message: "SomeThing Went Wrong", status: 500 }))
}
)
router.put('/editAlert', (req, res) => {
    var sql = "SELECT * FROM alert_edit('"   JSON.stringify(req.body)   "'::jsonb)"
    client.query(sql)
        .then(users => res.status(200).json({ message: "Updated Successfully", status: 200 }))
        .catch(err => res.status(404).json({ message: "Id Not Found", status: 404 }))
}
)
router.post('/getAll', (req, res) => {
    var sql = "SELECT * FROM alert_getall('"   JSON.stringify(req.body)   "'::jsonb);"
    client.query(sql)
        .then(users => res.status(200).send(users.rows))
        .catch(err => res.status(400).send(err))
}
)
router.delete('/deleteAlert', (req, res) => {
    var sql = "SELECT * FROM alert_delete('"   JSON.stringify(req.body)   "'::jsonb);"
    client.query(sql)
        .then(users => res.status(200).json({ message: "Deleted Successfully", status: 200 }))
        .catch(err => res.status(404).son({ message: "Id Not Found", status: 404 }))
}
)
module.exports = router
  

кто-нибудь может подсказать мне, как обработать эту ошибку?

Ответ №1:

Лучше разделить вашу функцию подключения к БД и контроллеров, затем создать оболочку вокруг комбинации client.connect(); и query , чтобы вызвать глобальную ошибку в вашем серверном приложении и, наконец, перехватить их с помощью middleware

Например

 // db.js
let connectionString = config.db.connectionString;
const client = new pg.Client(connectionString);
client.connect();

module.exports.query = function(sql, callback)
client.query(sql)
      .then(result => callback(result)}))
      .catch(err => throw err))

  
 // router
const client = require('db.js')
router.post('/addAlert', (req, res) => {
    var sql = "SELECT public.alert_insert('["   JSON.stringify(req.body)   "]')"
    client.query(sql ,(users)=> res.status(200).json({ message: "Created Successfully", status: 200 }))
}
)

  
 // server
...
// dbErrorHanler -> function to check db errors
app.user(dbErrorHanler);
...