0

我是 node 和 mongo db 的新手。我在每一行都有一个带有删除链接的用户列表。我正在尝试使用它的_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('/'); 
        }
      });

  });

这是我的观点,单击此链接后,我的 url 中的 _id 如下所示:http://localhost:3000/delete/4428439e14e3343ba4ac31c1

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

console.log(id) 给我 4428439e14e3343ba4ac31c1

但这给我带来了以下错误

错误:传入的参数必须是 12 个字节的单个字符串或新 ObjectID 处的 24 个十六进制字符的字符串

4

4 回答 4

1

也许你可以试试下面的代码:

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}.

我希望它可以帮助你。

于 2020-01-27T07:32:04.030 回答
1

ObjectID试试这个,如果字符串是有效的,你不需要创建ObjectID

为预防起见,您可以使用如下函数来测试是否ObjectID通过了valid

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> 
于 2020-01-27T07:28:26.570 回答
1

你可以使用 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('/'); 
        }
      });

  });
于 2020-01-27T07:53:25.450 回答
1

您需要创建一个ObjectIdusing的实例new。目前,您正在直接传递 ObjectId,因此您会收到该错误。

db.collection('users').deleteOne({_id: new ObjectId(req.params.id)},  function(err, res) {
  if (err) {
    throw err;
  } else {
    return res.redirect('/');
  }
});
于 2020-01-27T07:18:20.050 回答