MongoDb удаляет документы, передавая идентификатор пользователя - PullRequest
0 голосов
/ 27 января 2020

Я новичок в узле и пн go дБ. У меня есть список пользователей со ссылкой на удаление в каждой строке. Я пытаюсь удалить пользователя с его _id . Однако это не работает. Вот мой код роутера.

router.get('/delete/:id', function (req,res) {
    const ObjectId = require('mongodb').ObjectID;
    var id = req.params.id;
    console.log(id);
    db.collection('users').deleteOne({ _id: ObjectId(req.params.id) }, function(err, res) {
        if (err) {
        throw err;
        } else {
          return res.redirect('/'); 
        }
      });

  });

Вот мой взгляд, при нажатии на эту ссылку я получаю _id в своем URL, как это: http://localhost: 3000 / delete / 4428439e14e3343ba4ac31c1

<td><a href="/delete/ <%=  userdetails._id %>">Delete</a></td> 

console.log (id) дает мне 4428439e14e3343ba4ac31c1

Но выдает следующую ошибку

Ошибка: переданный аргумент должен быть одной строкой из 12 байтов или строкой из 24 шестнадцатеричных символов в новом ObjectID

Ответы [ 4 ]

1 голос
/ 27 января 2020

вы можете использовать findByIdAndRemove

router.get('/delete/:id', function (req,res) {
    var id  = req.params.id;
    db.collection('users').findByIdAndRemove( id , function(err, res) {
        if (err) {
        throw err;
        } else {
          return res.redirect('/'); 
        }
      });

  });
1 голос
/ 27 января 2020

Попробуйте, вам не нужно создавать ObjectID, если строка является действительной ObjectID

Для предотвращения вы можете использовать функцию, подобную приведенной ниже, чтобы проверить, передано ли действительное ObjectID или нет

function validateObjectId (id) {
    if (ObjectId.isValid(id)) {
        const obj = new ObjectId(id);
        if (obj == id) {
            return true;
        }
    }
    return false;
},


if(!validateObjectId(req.params.id))
    return res.send({'error':'Invalid ObjectID Passed',id:req.params.id});

db.collection('users').deleteOne({ _id: ObjectId(req.params.id) }, function(err, res) 
{
    if (err) {
    throw err;
    } else {
      return res.redirect('/'); 
    }
  });

Также уберите лишнее место отсюда

<td><a href="/delete/<%=userdetails._id%>">Delete</a></td> 
1 голос
/ 27 января 2020

Может быть, вы можете попробовать этот код ниже:

router.get("/delete/:id", function(req, res) {
  const ObjectId = require("mongodb").ObjectId;
  var { id } = req.params;
  console.log(id);
  db.collection("users").findOneAndDelete({ _id: ObjectId(id) }, function(
    error,
    response
  ) {
    if (error) {
      throw err;
    } else {
      return res.redirect("/");
    }
  });
});

Обновлено:

Попробуйте посмотреть свой код. Там вводит в заблуждение код, вы используете 2 раза res. Один - res из express, а другой - res, когда он удаляется на mongodb.

Итак, res.redirect ('/'), который вы используете в своей функции mongodb, равен res от mongodb, не res из express.

Попробуйте заменить {err, res} на {error, response}.

Надеюсь, это поможет вам.

1 голос
/ 27 января 2020

Вам необходимо создать экземпляр ObjectId, используя new. В настоящее время вы передаете ObjectId напрямую, поэтому вы получаете эту ошибку.

db.collection('users').deleteOne({_id: new ObjectId(req.params.id)},  function(err, res) {
  if (err) {
    throw err;
  } else {
    return res.redirect('/');
  }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...