<prompt> Tengeneza programu ya Node.js inayoingiliana na hifadhidata ya PostgreSQL ili kuhifadhi na kurejesha maelezo kuhusu vitabu kichwa, mwandishi, aina, tarehe ya kuchapishwa, na kuruhusu watumiaji kuchuja matokeo kulingana na sifa hizi.PLINFORMAT  <response>: const express needexpress;const Dimbwi needpg; Sanidi unganisho la hifadhidata la PostgreSQLconst pool Dimbwi jipya mtumiaji: jina_lako_la_la mtumiaji, mwenyeji: localhost, hifadhidata: booksdb, nenosiri: nenosiri_lako, bandari: 5432,;const app express;app.useexpress.json; Unda kitabu kipyaapp.postvitabu, async req, res const title, mwandishi, aina, publication_date req.body; jaribu const result wait pool.query INGIZA NDANI ya vitabu jina, mwandishi, aina, tarehe_ya_kuchapishwa THAMANI 1, 2, 3, 4, kichwa, mwandishi, aina, tarehe_ya kuchapishwa ; res.status201.tumaKitabu kimeongezwa; kukamata kukosea console.errorkosa; res.status500.tumaHitilafu ya seva; ; Pata vitabu vyoteapp.getvitabu, async req, res jaribu const result await pool.queryCHAGUA KUTOKA kwa vitabu; res.jsonmatokeo.safu; kukamata kukosea console.errorkosa; res.status500.tumaHitilafu ya seva; ; Sasisha kitabu kwa kitambulishoapp.putbooks:id, async req, res const id parseIntreq.params.id; const title, mwandishi, aina, publication_date req.body; jaribu const result wait pool.query UPDATE vitabu SET title1, author2,genre3, publication_date4 WHERE id5, kichwa, mwandishi, aina, tarehe_ya_kuchapishwa, kitambulisho ; res.sendKitabu kimesasishwa; kukamata kukosea console.errorkosa; res.status500.tumaHitilafu ya seva; ; Futa kitabu kwa kitambulishoapp.deletebooks:id, async req, res const id parseIntreq.params.id; jaribu const result await pool.queryFUTA KUTOKA kwa vitabu WHERE id1, id; res.sendKitabu kimefutwa; kukamata kukosea console.errorkosa; res.status500.tumaHitilafu ya seva; ; Pata vitabu vilivyochujwaapp.getvitabuchujio, async req, res const title, mwandishi, aina, publication_date req.query; let query CHAGUA KUTOKA kwenye vitabu WAPI kweli; const queryParams ; ikiwa kichwa swala NA kichwa KAMA queryParams.length 1; queryParams.push title ; ikiwa mwandishi swala NA mwandishi LIKE queryParams.length 1; queryParams.push mwandishi ; ikiwa aina swala NA aina INAPENDEZA queryParams.length 1; queryParams.push aina ; ikiwa tarehe_ya_kuchapishwa swala AND publication_date queryParams.length 1; queryParams.pushtarehe_ya_kuchapishwa; jaribu const result await pool.queryswali, queryParams; res.jsonmatokeo.safu; kukamata kukosea console.errorkosa; res.status500.tumaHitilafu ya seva; ; Anzisha sevaapp.sikiliza3000, console.logSeva inafanya kazi kwenye bandari 3000;; 