使用Express和Node.js更新MongoDB中的单个记录

4

我希望在MongoDB中的集合中通过_id更新单个记录。

更新:我将res更改为req(谢谢!)并在传递的objectId周围实现了db.ObjectId(),现在我收到了500个内部服务器错误。

    "_id" : ObjectId("54d5296711436278137af74b"),
    "username" : "alex",
    "email" : "alex@gmail",
    "fullname" : "alex man",
    "age" : "15",
    "location" : "minneap",
    "gender" : "mal"

这是我从客户端发起的ajax请求。

    $.ajax({
                    type: 'PUT',
                    data: updatedUser,
                    url: '/users/updateuser/' + globalUserID,
                    dataType: 'JSON'
                }).done(function(response){

这是路由代码。
/*
* PUT to updateuser
*/
router.put('/updateuser/:id', function(req, res) {
var db = req.db;
var userToUpdate = req.params.id;
db.collection('userlist').update(
{ _id: userToUpdate},
   req.body,
    function(err, result){
    res.send(
        (err === null) ? {msg: ''} : {msg: err}
    );
   });
});

我收到了一个200的响应,但我的记录没有被更新。我的语法有什么问题吗?

2
res.send总是会发送200。因为它返回的要么是空字符串,要么是带有状态码200 OK的错误信息。如果出现错误,您应该使用res.status(500).send('Something broke!'); - silverfighter
2个回答

5

您需要确保将字符串 _id 转换为 ObjectId

此外,您使用了 res.body 而不是 req.body。

router.put('/updateuser/:id', function(req, res) {
    var db = req.db;
    var userToUpdate = req.params.id;
    db.collection('userlist').update({ _id: ObjectId(userToUpdate)}, req.body, function (err, result) {
        res.send(
            (err === null) ? {msg: ''} : {msg: err}
        );
    });
});

不同的驱动程序使用不同的方法来创建ObjectId:

  • mongoDB原生驱动程序:new ObjectId(idString);
  • mongoJS:db.ObjectId(idString);
  • mongoSkin:toObjectID(idString);
  • mongoose:mongoose.Types.ObjectId(idString);

我假定 db 是你的 MongoDB 驱动程序,所以它应该可行。db.ObjectId() 可能不是为你的数据库驱动程序创建对象 ID 的方法。对于 mongojs 而言是这样的,但如果你使用其他的 MongoDB 驱动程序,db.ObjectId() 可能无法正常工作。此外,收到了什么样的错误堆栈? - Brian Noah
你可以尝试使用新的ObjectID(idString)方法,这是原生mongoDB使用的方法。而在Mongoose中,你需要使用mongoose.Types.ObjectId(string)方法。 - Brian Noah
我的数据库是“mongo.db(url)”数据库连接。节点应用程序的错误堆栈没有提供太多信息。PUT /users/updateuser/54d3ba6cfe49c07c04733fac 500 42.412毫秒。 - javascript Jenkins
我会接受这个答案,因为提供了很多好的信息,但是我仍然有问题。 - javascript Jenkins
一旦您成功更新文档,err, res 响应将类似于 null, { "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }。只需使用 console.log() 输出所有内容。 - Brian Noah
显示剩余4条评论

1

应该是req.body而不是res.body

db.collection('userlist').update(
{ _id: userToUpdate},
   res.body -> should be req.body

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接