! Нам нужно идти глубже! Элементы в mongoDB не будут удалены - PullRequest
0 голосов
/ 03 ноября 2019

Я создал простой REST 'todo-List', и все работает отлично, за исключением удаления элементов из моего mongoDB.

Когда я удаляю элемент через мой файл main.js, я получаю ответ 200 для моего 'DELETEметод. Однако элемент не удаляется из mongoDB и, таким образом, все еще отображается в моем списке.

Я использовал метод deleteOne () вместо remove (), поскольку последний считается устаревшим согласно полученному сообщению, но это не будетпереломить ситуацию.

может кто-нибудь помочь здесь.

Код в моем app.js доступа к БД, который должен удалить элемент.

let express = require('express');
let app = express();
let bodyParser = require('body-parser');
let mongoose = require('mongoose');

mongoose.connect('mongodb+srv://Daniel:xxxxxx@clusterpetertester-h0t6v.mongodb.net/test?retryWrites=true&w=majority', {useUnifiedTopology: true, useNewUrlParser: true, useCreateIndex: true });

let taskSchema = new mongoose.Schema ({
  item: String
})

app.use(bodyParser.urlencoded({extended: true}));
app.set('view engine', 'ejs');
app.use(express.static('./'))


let Task = mongoose.model("Tasks", taskSchema);

app.get('/todoparents', function(req, res) {
  Task.find({}, function(err, item) {
    if (err) {
    } else {
      res.render('todoparents', {item : item})
    }
  });
});

//submit button route
app.post('/newTask', function(req, res) {
  console.log(' item submitted! ');
  let newItem = new Task({
    item: req.body.input
  })
  Task.create(newItem, function (err, Task) {
    if (err) console.log(err)
    else {
      console.log("Inserted Item : " + newItem)
    }
  })
  res.redirect('todoparents');
});

app.delete('/todoparents/:item', function (req, res) {
  //delete the requested item form mongodb
  Task.find({item: req.params.item.replace(/\-/g,"")}).deleteOne(function (err, data) {
    if (err) throw err;
    res.json(data)
    console.log(data)
  });
});


let port = 3333;
app.listen(port);
console.log('The server is up on port #', port);

Вот мой HTMLв моем todoparents.ejs

<div class="container">

          <h1>Time to burden the children</h1>

          <ul id="taskList">
              <% for(var i=0; i < item.length; i++) { %>
                <li class="task-item<%=[i] %>"> 
                  <span class="task-info"> <%= item[i].item %> </span>
                  <span class="delete">Delete</span> 
                </li>
             <% } %>
          </ul>     

        </div>

Код в main.js получает правильный 'span' на клике с моего todoparents.ejs

//gets the first span in an li and returns the textcontent
let taskList_Ul = document.getElementById('taskList');
taskList_Ul.addEventListener('click', function(e) {

  let clickedElement = e.target;
  let content_clicked_Sibling = clickedElement.previousElementSibling.textContent;

  //the spaces are replaced with not spaces
  let item = content_clicked_Sibling.replace(/ /g, "");

// getting the url and attaching the item which was targeted
  fetch('/todoparents/' + item, {
  method: 'DELETE',
  headers: {
    'Content-Type': 'application/json',
  }
}).then(response => response.json()
    .then(data => {
      return data;
    })
  );
});

Вот данные, которые я получил с консоли.log (данные) в app.js. Кажется, ничего не удалено, так как в конце мы удалилиCount: 0

{ n: 0,
  opTime:
   { ts:
      Timestamp { _bsontype: 'Timestamp', low_: 1, high_: 1572802291 },
     t: 5 },
  electionId: 7fffffff0000000000000005,
  ok: 1,
  operationTime:
   Timestamp { _bsontype: 'Timestamp', low_: 1, high_: 1572802291 },
  '$clusterTime':
   { clusterTime:
      Timestamp { _bsontype: 'Timestamp', low_: 1, high_: 1572802291 },
     signature: { hash: [Binary], keyId: [Long] } },
  deletedCount: 0 }

Mongodb_Collection

UX приложения (очень просто) UX of app

изображение консоли после попытки удалить элемент.

enter image description here

Ответы [ 2 ]

1 голос
/ 03 ноября 2019

Вместо использования .find() вы должны сделать это:

Task.deleteOne({item: req.params.item.replace(/\-/g,"")}, function (err, data) {
  if (err) throw err;
  res.json(data)
  console.log(data)
});
0 голосов
/ 03 ноября 2019

Какой формат поля первичного ключа _id вы используете? Это стандарт ObjectId? Если это так, вам может потребоваться преобразовать значение, которое вы передаете в виде поля _id для вызова удаления, в ObjectId перед удалением. В противном случае вы фактически отправляете строковое значение, которое не найдено в столбце _id, и вызов delete удаляет ноль записей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...