try - catch טיפול בשגיאות בהוספת collaction למסד mongodb
-
שלום לכל החברים!
יש לי פרויקט ב- node.js עם express.js השומרת נתונים לתוך מסד של mongodb
כשאני מנסה להכניס פעמיים את אותו "_id" הוא זורק לי שגיאה כמו "לא ניתן להכניס מפתח כפול", ואז הוא סוגר לי את השרת. (עד כאן מובן).על מנת שלא יכבה לי את השרת, אני מנסה לתפוס את השגיאה עם try - catch, אך ללא הצלחה
הנה הקוד שלי אשמח אם מישהו יכוון אותי מה לא תקין:
app.get('/', cors(), (req, res, next) => { let p = req.query try { collections.insertMany([p]) console.log(p); } catch (error) { next(), console.log('myError is:', error); } })
-
@katz אני משער שפונקציית
insertMany
היא פונקציה אסינכרונית (כלומר היא מחזירה מיד promise והפעולה עצמה קורה ברקע אחרי החזרה) ואם כן אי אפשר לתפוס את השגיאות על ידי try/catch רגיל אלא על ידי הצמדתcatch
ל-promise שהפונקציה מחזירה, ככה:app.get('/', cors(), (req, res, next) => { let p = req.query; collections.insertMany([p]).catch((error) => { next(), console.log('myError is:', error); }); console.log(p); });
אפשריות נוספת היא להפוך את ה-handler לפונקציה אסינכרונית על ידי הוספת מילת
async
לפני הצהרת הפונקציה. ואז אפשר לתפוס שגיאות בצורה דמוי סינכרונית אם תכתובawait
לפני הקריאה של הפונקציה:app.get('/', cors(), async (req, res, next) => { let p = req.query; try { await collections.insertMany([p]) console.log(p); } catch (error) { next(); console.log('myError is:', error); } })
(חשוב שתבין מה עשיתי ובעיקר למה זה נצרך, ולא סתם לפתור את הבעיה על ידי העתקת הקוד התקין...)
אגב, יש הבדל בין שתי הגירסאות שכתבתי בנוגע לעיתוי של הקריאה ל-console.log(p)
.