【问题标题】:JavaScript not assigning an element to the objectJavaScript 未将元素分配给对象
【发布时间】:2019-02-24 18:20:54
【问题描述】:
const allocation_me = async (request, response) => {
  try {
    const { user: userid } = request;
    if (!ObjectId.isValid(userid)) throw new Error('invalid objectid');

    const now = moment().format();
    const date = new Date(now);
    const allocation = await Allocation.findOne({ $and: [{ user: userid, start_date: { $lt: date }, end_date: { $gt: date } }] })
      .populate('user', 'name')
      .populate('garden');
    if (!allocation) throw new Error('invalid request');
    allocation.timestamp = moment(allocation.end_date).format('x');
    response.status(200).send(allocation);
  } catch (error) {
    response.status(400).send(error);
  }
};

我正在尝试将时间戳添加到 mongo 查询返回的对象,但是当它发送分配作为响应时,时间戳不会显示。我尝试记录 allocation.timestamp 值,但它也没有显示,就像 javascript 忽略了我分配它一样。我尝试从 const 更改为 let,但显然这不是问题。

【问题讨论】:

  • 您还可以在这里使用.lean()...类似.populate('user', 'name') .populate('garden').lean()...

标签: javascript mongodb mongoose async-await


【解决方案1】:

...就像 javascript 忽略了我分配它一样。

如果分配对象是 MongoDB 的 sealedfrozen,这是完全可能的。

相反,制作一个副本并将您的属性添加到副本中,也许使用 ES2018 的属性传播:

allocation = {...allocation, timestamp: moment(allocation.end_date).format('x')};

...或者如果你不能使用属性传播,Object.assign:

allocation = Object.assign({}, allocation, {timestamp: moment(allocation.end_date).format('x')});

在这两种情况下,您都需要将 const 更改为 let,因为我们正在更改变量 allocation 所保存的值。或者当然,将其保留为 const 并单独记住修改后的版本:

const updatedAllocation = {...allocation, timestamp: moment(allocation.end_date).format('x')};
response.status(200).send(updatedAllocation);

我尝试从 const 更改为 let,但显然这不是问题。

正确。 const 适用于变量 (allocation),而不是变量所指的对象。

【讨论】:

  • allocation = {...allocation._doc, timestamp: moment(allocation.end_date).format('x')}; 完美运行。感谢您的快速回复。
【解决方案2】:

查询返回的文档是 mongoose/mongodb 文档,而不是普通的 javascript 对象。

因此,要修改返回文档中的任何内容,您必须将其分配给 new Object(),或者您可以使用 .lean() 选项将 mongoose 对象转换为纯 javascript 对象。

const allocation = await Allocation.findOne({})
      .populate('user', 'name')
      .populate('garden')
      .lean()
if (!allocation) throw new Error('invalid request');
allocation.timestamp = moment(allocation.end_date).format('x');

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-30
    • 1970-01-01
    • 2012-04-28
    • 2015-11-05
    • 2018-06-23
    • 1970-01-01
    • 1970-01-01
    • 2017-03-19
    相关资源
    最近更新 更多