как я могу активировать кнопку редактирования? mongodb

#javascript #node.js #mongodb #ejs

#javascript #node.js #mongodb #ejs

Вопрос:

Я получил эту ошибку CastError: не удалось выполнить приведение к ObjectId для значения «details5f9c3b069dc8723528c64cc8» по пути «_id» для модели «Book»

кнопки редактирования и удаления не активированы.

Помогите мне разобраться, пожалуйста. это /routes/books.js

и что еще я могу загрузить сюда?

 // GET edit an existing Book
router.get('/:id', (req, res, next) => {
  let id = req.params.id;
  
  book.findById(id, (err, bookToEdit) => {
    if(err) {
      console.log(err);
      //res.end(err);
    } else {
      //show the edit view
      res.render('books/details', {title: 'Edit Book', books: bookToEdit})
    }
  });
});

// POST and update the document
router.post('/:id', (req, res, next) => {
  let id = req.params.id
  
  let updatedBook = book({
    _id: id,
    title: req.body.title,
    description: req.body.description,
    price: req.body.price,
    author: req.body.author,
    genre: req.body.genre
  });

  book.updateOne({_id: id}, updatedBook, (err) => {
    if(err) {
      console.log(err);
      res.end(err);
    } else {
      // refresh
      res.redirect('/books');
    }
  });
});

// GET - process the delete by user id
router.get('/delete/:id', (req, res, next) => {
  let id = req.params.id;

  book.remove({_id: id}, (err) => {
    if(err) {
      console.log(err);
      res.end(err);
    } else {
      // refresh
      res.redirect('/books');
    }
  });
});  

Это /books/details.ejs

     <div class="container">
      <div class="row">
          <form class="form" method="post">
              <div class="form-group">
                <label for="TitleTextField">Title</label>
                <input type="text" class="form-control" id="TitleTextField"
                placeholder="Book Title" name="title" value="<%= books.Title %>" required>
              </div>

<div class="form-group">
                <label for="AuthorTextField">Author</label>
                <input type="text" class="form-control" id="AuthorTextField"
                placeholder="Book Author" name="author" value="<%= books.Author %>"  required>
              </div>

              <div class="form-group">
                <label for="PriceTextField">Price</label>
                <input type="text" class="form-control" id="PriceTextField"
                placeholder="Book Price" name="price" value="<%= books.Price %>"  required>
              </div>
              
             

      </div>
    </div>  

и это /books/indexejs

 <% include ../partials/header.ejs %>

    <!-- MAIN CONTENT -->
    <div class="container">
      <div class="row">

<!--Add-->

          <a href="/books/add" class="btn btn-primary"><i class="fa fa-plus"></i> Add a book</a>
          <br>
          <br>
          <div class="table-responsive">
            <table class="table table-bordered table-striped table-hover">
              <thead>
                <tr>
                  <th>Title</th>
                  <th class="text-center">Author</th>
                  <th class ="col-4">Price</th>


                  <th class="text-center">EDIT</th>
                  <th class="text-center">DELETE</th>
                </tr>
                </thead>
                <tbody>

                <% for (let count = 0; count < books.length; count  ) { %>
                <tr>
                  <td><%= books[count].Title %></td>
<td class="text-center"><%= books[count].Author %></td>
                  <td class="text-center">$<%= books[count].Price %></td>
                  <!--EDIT-->

                  </td>
                    <td class="text-center">
                      <a href="/books/edit<%= books[count].id %>" class="btn btn-primary btn-sm">
                        <i class="fas fa-pencil-alt"></i> Edit</a>
                    </td>

<!--DELETE-->
                    <td class="text-center">
                      <a href="/books/delete<%= books[count].id %>" class="btn btn-danger btn-sm">
                        <i class="fas fa-trash-alt"></i> Delete</a></td>

                  </td>
                </tr>
                <% } %>
              </tbody>
            </table>
          
          </div>
        </div>
      </div>
    </div>

<% include ../partials/footer.ejs %>  

это /models/books.js

 let mongoose = require('mongoose');

let Book = mongoose.Schema({
  
    Title: String,
    Description: String,
    Price: Number,
    Author: String,
    Genre: String
},
{
  collection: "books"
});

module.exports = mongoose.model('Book', Book);  

надеюсь, это поможет устранить проблемы

Комментарии:

1. _id заполняется для вас мой MongoDB. Если вам нужен определенный идентификатор, который будет помещен в сохраняемый документ, создайте свойство модели с именем id (без подчеркивания). Затем установите свои id в модели id , а затем _id

2. @RandyCasburn хорошо, это отличная идея. так будет лучше работать. как насчет решений?

3. «а как насчет решений? » —— Я сказал это: «Если вам нужен определенный идентификатор, который будет помещен в сохраняемый документ, создайте свойство модели с именем id (без подчеркивания). Затем введите свой идентификатор в идентификатор модели, а затем _id »

Ответ №1:

У вас ошибка, в которой говорится, что книга.найти и забронировать.для удаления необходим ObjectId в качестве параметра. И details5f9c3b069dc8723528c64cc8 не является допустимым идентификатором объекта для Mongo.

Просто прочитайте сообщение об ошибке!

Издание

Возможно, вы столкнулись с этой проблемой, потому что допустили небольшую ошибку с ресурсами, используя один и тот же http POST для создания и редактирования, указав:id в path в обоих случаях.

Если у вас есть метод POST / (без идентификатора в path) для создания книг, позволяющий mongodb генерировать идентификаторы, и есть метод PATCH (или PUT) /:id для обновления этих книг, у вас, вероятно, больше не будет такого рода ошибок.

Возможно, это будет звучать как глупое дублирование, но по мере роста вашего приложения вам, безусловно, нужно будет добавить некоторые конкретные правила безопасности.

Кроме того, если я правильно помню mongoose, вы не должны обновлять _id во втором параметре для updateOne.

 //no _id present in updatedBook
book.updateOne({_id: id}, updatedBook, (err) => { };
  

Комментарии:

1. Должно быть ясно, что OP не понял значения неясной ошибки at. Хотя этот ответ несколько едкий, он не очень полезен.

Ответ №2:

Ключ по умолчанию для документа в MongoDB _id — это тот, кто установил в нем идентификатор объекта. ObjectId — это уникальный ключ, который содержит некоторую значимую базу данных по дате и времени (вы можете преобразовать ObjectId в дату). Подробнее об этом можно прочитать здесь .

И ваша проблема, это действительно просто. Вы объединяете свой ObjectId с деталями, как вы можете видеть в ошибке.

details5f9c3b069dc8723528c64cc8 => 5f9c3b069dc8723528c64cc8