<prompt> Unda hati ya Node.js inayotumia mfumo wa Express kutekeleza API ya RESTful yenye ncha za kuunda, kusoma, kusasisha na kufuta rekodi za muundo wa Bidhaa. Muundo wa Bidhaa unapaswa kuwa na sehemu za jina, maelezo, bei na kiasi. Tumia MongoDB kama hifadhidata ya mazingira ya nyuma na uthibitishe pembejeo kwa kutumia vifaa vya kati vya kithibitishaji.  <response>: Ili kuunda RESTful API kwa kutumia Node.js, Express, MongoDB, na Express-validator, fuata hatua hizi:1. Sakinisha vifurushi vinavyohitajika:bashinpm init -ynpm sasisha Express mongoose Express-validator dotenv2. Unda faili ya .env ili kuhifadhi kamba yako ya unganisho ya Unda kielelezo cha Bidhaa katika faili mpya inayoitwa modelsProduct.js: javascriptconst mongoose needmongoose;const ProductSchema mongoose.Schema mpya jina: aina: kamba, Inahitajika: kweli, , maelezo: aina: kamba, Inahitajika: kweli, , bei: aina: nambari, Inahitajika: kweli, , wingi: aina: nambari, Inahitajika: kweli, ,;module.exports mongoose.modelBidhaa, ProductSchema;4. Unda faili ya index.js na msimbo ufuatao: javascriptneeddotenv.config;const express needexpress;const body, validationResult needexpress-validator;const mongoose needmongoose;const Bidhaa hitaji.modelsBidhaa;const app express; Unganisha kwa MongoDBmongoose.connectprocess.env.MONGODB_URI, useNewUrlParser: kweli, useUnifiedTopology: kweli, useFindAndModify: uongo,;mongoose.connection.onimeunganishwa, console.logImeunganishwa kwa MongoDB;app.useexpress.json; PATA bidhaa zoteapp.getbidhaa, async req, res jaribu const products wanasubiri Product.find; res.jsonbidhaa; kukamata kukosea res.status500.jsonkosa: Hitilafu ya seva ; ; PATA bidhaa mojaapp.getproducts:id, async req, res jaribu const product await Product.findByIdreq.params.id; ikiwa !bidhaa itarudisha res.status404.jsonkosa:Bidhaa haijapatikana ; res.jsonbidhaa; kukamata kukosea res.status500.jsonkosa: Hitilafu ya seva ; ; POST bidhaa mpyaprogramu.chapisho bidhaa, bodyjina.notEmpty.withMessageJina linahitajika, bodymaelezo.notEmpty.withMessageMaelezo yanahitajika, bodybei.isNumeric.withMessageBei lazima iwe nambari, bodyquantity.isInt gt: -1 .withMessageWingi lazima iwe nambari kamili isiyo hasi, , async req, res const errors validationResultreq; ikiwa !errors.isEmpty inarudisha res.status400.json errors: errors.array ; jaribu const product Bidhaa mpyareq.body; subiri product.save; res.status201.jsonbidhaa; kukamata kukosea res.status500.json kosa: Hitilafu ya seva ; ; WEKA sasisha bidhaaapp.put bidhaa:id, bodyjina.optional.notEmpty.withMessageJina haliwezi kuwa tupu, bodymaelezo. hiari.notEmpty.withMessageMaelezo hayawezi kuwa tupu, bodybei. hiari.isNumeric.withMessageBei lazima iwe nambari, bodyquantity.optional.isInt gt: -1 .withMessageIdadi lazima iwe nambari kamili isiyo hasi, , async req, res const errors validationResultreq; ikiwa !errors.isEmpty inarudisha res.status400.json errors: errors.array ; jaribu const product await Product.findByIdAndUpdatereq.params.id, req.body, mpya: true ; ikiwa !bidhaa itarudisha res.status404.jsonkosa:Bidhaa haijapatikana ; res.jsonbidhaa; kukamata kukosea res.status500.json kosa: Hitilafu ya seva ; ; FUTA bidhaaapp.deleteproducts:id, async req, res jaribu const product await Product.findByIdAndDeletereq.params.id; ikiwa !bidhaa itarudisha res.status404.jsonkosa:Bidhaa haijapatikana ; res.json ujumbe: Bidhaa imefutwa kwa mafanikio ; kukamata kukosea res.status500.json kosa: Hitilafu ya seva ; ;const PORT process.env.PORT 3000;app.listenPORT, console.logSeva inayoendesha kwenye bandari PORT;Sasa una RESTful API yenye ncha za kuunda, kusoma, kusasisha, na kufuta rekodi za muundo wa Bidhaa. Ingizo huidhinishwa kwa kutumia vifaa vya kati vya kithibitishaji cha Express. 