#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);
...