קורס Node.JS שיעור טפסים


זהו נושא דיון מלווה לערך המקורי שב־https://www.tocode.co.il/bundles/nodejs/lessons/25-forms

היי ינון, אני לא מוצא את כל הקוד של הקורס backend בתיקיה אחת, תוכל לשלוח לי קישור

הי בטח זה כאן:

ואפשר להוריד את זה בתור קובץ זיפ מכאן:
https://github.com/tocodeil/nodejs-course-demos/archive/refs/heads/master.zip

ינון שלום
הוספתי את האפשרות למחיקה של רשומה
הדרך שבחרתי קצת מסורבלת השינויים שביצעתי
בקובץ app.js
הוספתי ניתוב לקובץ del.js שנמצא בתיקית routes
תוכן הקובץ

var express = require('express');

var router = express.Router();

const contacts = require('../lib/contacts');

//del user

router.get('/:id', function(req, res) {

    console.log('del');

    const id = req.param('id');

    contacts.deleteContact(id);

    res.render('contacts/index', { contacts: contacts.listContacts() });

   // res.render('contacts/edit', { item: item });

});

module.exports = router;

בקובץ index.ejs הוספתי את הקוד הבא כדי להוסיף את “כפתור המחיקה”

<ul>

            <% for (let c of contacts) { %>

                <li>

                    <a href="<%= `/contacts/${c.id}` %>">

                    <%= c.name %> &lt;<%= c.email %>&gt;

                    </a>

                    <%= c.name %> [<%= c.email %>]

                    <a href="<%= `/contacts/${c.id}` %>">Edit</a>

                    <a href="<%= `/del/${c.id}` %>">Delete</a>

                </li>

            <% } %>

        </ul>

הקוד עובד אך האם יש דרך להימנע מהוספת הקובץ
del.js
בברכה
גל

הי @galroy,

אין בעיה לכתוב את הנתיב בקובץ ניתוב קיים ופשוט לתת לו איזושהי תחילית - לדוגמה:

router.get('/del/:id', function(req, res) {

שיטה יותר מקובלת היא להשתמש ב http vert אחר - במקרה של מחיקה זה הפועל delete, ואז הנתיב נראה כך:

router.delete('/:id', function(req, res) {

שים לב שאם אתה בוחר בשיטה השניה אתה צריך שהכפתור שלך לא יהיה href רגיל אלא ממש טופס, כלומר ב ejs תצטרך לכתוב משהו כמו:

<form action="<%= `/${c.id}` %>" method="POST">
  <input type="submit" value="Delete" />
  <input type="hidden" name="_method" value="DELETE" />
</form>

ולהשתמש בתוסף כמו method-override:

כדי שאקספרס יבין ששלחת בקשת DELETE

לייק 1

היי,
משום מה לא עובד לי המחיקה
זה הראוטר:


וזה הקישור למחיקה

אשמח לעזרה
תודה רבה!

הי,
זה נכון - אלמנט <a> מייצר בקשה מסוג get אבל ה router שלך מטפל בבקשות מסוג delete:

router.delete(...)

יש לך שתי אפשרויות לתקן:

  1. אפשר לשנות את סוג הבקשה בקוד צד שרת במקום router.delete לכתוב router.get. זה יטפל בבקשת ה get שהטופס שולח והכל יעבוד. החיסרון כאן הוא שבבקשת get אם משתמש מנסה לרענן את הדף הכל יעבוד והבקשה עלולה להישלח כמה פעמים, וגם זה לא נהוג למחוק בבקשות get.

  2. אפשר להישאר עם סוג בקשה delete אבל לתקן את העמוד והשרת כדי שהבקשה תוכל לעבור.

בשביל להעביר בקשת delete אנחנו צריכים כמה דברים:

בשרת אני צריך להתקין מידלוור שנקרא method-override לפי ההוראות כאן:

ואז בקוד צד השרת יהיה:

app.use(methodOverride('_method'))

ב ejs אני צריך לשנות את ה a לטופס ששולח בקשת post עם דריסת ה method למחיקה, כלומר במקום ה a יהיה:

<form method="POST" action="<%= `/contacts/delete/${c.id}` %>?_method=DELETE">
  <button type="submit">Delete resource</button>
</form>

וואי ינון תודה על התשובה

אני מנסה לרנדר אחרי המחיקה דף HTML שיהיה כתוב בו שהפריט נמחק
וזה לא מצליח לי


הקובץ ejs:

השגיאה:

תודה!

הי
הוא מחפש את קובץ הטמפלייט delete אבל לא מוצא אותו. יכולה להדביק כאן את רשימת כל הקבצים והתיקיות בפרויקט? או לבדוק איזה קבצים יש בתיקיית ה views? או לבדוק איך כתובות פקודות res.render אחרות שכן עובדות לך?