【问题标题】:Need to modify json and return inside aync find operation需要修改json并在异步查找操作中返回
【发布时间】:2016-07-15 00:03:54
【问题描述】:

我需要遍历一个对象ID列表,找到一个用户,然后修改json对象并返回它。

我研究了 bluebird,但下面的代码并没有按照我的意愿执行。返回后好像修改了json对象。

我尝试返回user["test"] = "lol",但这只返回“test”的值,而我需要整个更新的 json。

Promise.map(['5781635026d6fad4486d81e9', '578296e31029e27b4ea53e9d'], function(i) {
  return User.findOneAsync({
    _id: i
  }).then(function(user) {
    user["test"] = "lol";
    return user;
  });
}).then(function(array) {
  res.send(array);
})

有没有一个优雅的解决方案?

【问题讨论】:

  • 请显示arrayuser的内容。在代码中,您已经展示了 array 将是一个包含返回的 user 对象的数组。除了 JSON 是一个字符串之外,您还在谈论 JavaScript 对象。
  • 该数组只包含未经修改的用户对象。
  • useruser["test"] = "lol";之后的内容是什么?在user["test"] = "lol"; 之后直接放置一个console.dir(user);
  • 它是没有“test”属性的同一个用户对象。
  • console.dir(Object.isFrozen(user));console.dir(Object.isExtensible(user)); 向您展示了什么?

标签: javascript node.js mongodb mongoose bluebird


【解决方案1】:

您可以采取的一种简单方法是将 $in 运算符与查询中的 id 数组一起使用,然后应用 lean() 方法返回纯文本Mongoose documents 的 JS 对象不允许添加属性。

看看这个例子:

User.find({ "_id": { "$in": ['5781635026d6fad4486d81e9', '578296e31029e27b4ea53e9d'] } })
    .lean()
    .exec()
    .then(function(docs) {  
        var users = docs.map(function(user) {
            user["test"] = "lol";
            return user;
        });
        res.send(users);
    })

【讨论】:

  • 只是出于好奇,你知道对象是如何被保护的吗?以及为什么他们会为Object.isExtensible(user) 返回true
  • @t.niese 不太确定,但因为 Mongoose 文档是 Mongoose 模型的实例,因此它们不允许添加属性
猜你喜欢
  • 2016-12-18
  • 2011-12-23
  • 1970-01-01
  • 2019-03-03
  • 2020-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多