मैंने एक एपीआई बनाया जो एक वादा प्रवाह में डेटाबेस प्रतिक्रियाओं को एकीकृत करता है, लेकिन मुझे लगता है कि कोड की व्याख्या जटिल है और मेरा मानना ​​​​है कि एसिंक/प्रतीक्षा दृष्टिकोण दोनों समझ और कोड को बेहतर बना सकता है।

एपीआई नेवले 5.6.1 और एक्सप्रेस 4.17.1 का उपयोग करके नोडजेएस में बनाया गया है।

क्या आप इसे सुधारने में मेरी मदद कर सकते हैं?

नीचे वह एपीआई है जिसे मैं सुधारना चाहता हूं:

/** New employee */
router.post('/', (req, res) => {
    let { idCompany, name, departament } = req.body;
    let _id = mongoose.Types.ObjectId(); // Generating new MongoDB _ID
    let employeeCreated;

    const promise1 = new Promise((resolve, reject) => {
        // Querying by document '$oid'
        Companies.findOne({ _id: idCompany }, (err, company) => {
            // Error returned
            if (err) reject({ error: "Invalid request, something went wrong!" });
            // Invalid data received
            if (!company) reject({ error: "Unauthorized action!" });
            // Everything OK
            resolve(company);

        });
    })
    .then(company => {
        if(company) {
            const promise2 = new Promise((resolve, reject) => {
                Employees.create({ _id, idCompany, name, departament }, (err, employee) => {
                    // Error returned
                    if (err) reject({ error: "Invalid request, something went wrong!", err });
                    // Everything OK
                    employeeCreated = employee;
                    resolve(company);
                });
            })
            return promise2;
        }else reject({ error: "Company not found!" });
    })
    .then(company => {
        let { name: companyName, address, email, tel, employees } = company;
        employees.push(_id);

        const promise3 = new Promise((resolve, reject) => {
            Companies.findByIdAndUpdate(
                { _id: idCompany },
                { $set: { _id: idCompany, name: companyName, address, email, tel, employees } }, // spotlight
                { new: true },
                (err, company) => {
                    // Something wrong happens
                    if (err) reject({ success: false, error: "Can't update company!" });
                    // Everything OK
                    resolve(company);
                }
            );
        });
        return promise3;
    });

    promise1
        .then(() => res.json({ success: true, employeeCreated }))
        .catch(err =>   res.status(400).json({ error: "Invalid request, something went wrong!", err }));
});

सादर।

1
Caio_Barbosa 3 जुलाई 2019, 18:26

2 जवाब

सबसे बढ़िया उत्तर

नेवले के साथ वादों का उपयोग करने की एक कुंजी, exec का उपयोग करना है तरीका:

आपका कोड तब कुछ इस तरह दिख सकता है (परीक्षण नहीं किया गया):

router.post('/', async (req, res) => {
    try {
        const { idCompany, name, departament } = req.body;
        const _id = mongoose.Types.ObjectId();
        const company = await Companies.findOne({ _id: idCompany }).exec();
        const employeeCreated = await Employees.create({ _id, idCompany, name, departament });
        const { name: companyName, address, email, tel, employees } = company;
        employees.push(_id);
        await Companies.findByIdAndUpdate(
                    { _id: idCompany },
                    { $set: { _id: idCompany, name: companyName, address, email, tel, employees } }, // spotlight
                    { new: true }).exec();
        res.json({ success: true, employeeCreated });
    } catch(err) {
        res.status(400).json({ error: "Invalid request, something went wrong!", err });
    }
});

यदि आपको यह आवश्यक लगे तो आप कुछ विशिष्ट कस्टम त्रुटियों को try ब्लॉक में डाल सकते हैं।

1
trincot 3 जुलाई 2019, 18:59

आप केवल वे कार्य कर सकते हैं जहाँ आपके वादे async चल रहे हैं और इसलिए, आप वादों के हल होने की प्रतीक्षा कर सकते हैं।

उदाहरण के लिए, अपने मार्ग में इसका उपयोग करें:

router.post('/', async (req, res) => {

और फिर एसिंक ऑपरेशन करते समय, इसका उपयोग करें:

const company = await Companies.findOne({ _id: idCompany }).exec();

साथ ही, मैं आपको सुझाव दूंगा कि आप इसे try and catch statments के साथ लपेटें

आशा है कि इससे सहायता मिलेगी!

0
Alvaro 3 जुलाई 2019, 21:41