使用lodash检查空对象将返回false

问题描述 投票:3回答:3

我有一个对象req.user.stripe,其值为空对象{}。我想使用lodash函数isEmpty()来检查这个对象是否为空。当我运行console.log(_.isEmpty(req.user.stripe))时,我得到false的返回值。 console.log(req.user.stripe)实际上返回一个空对象{}

不确定我错过了什么。我愿意使用除了lodash之外的其他方法。本质上,我需要访问req.user.stripe中的属性,但仅当req.user.stripe不是空对象时(否则我会收到一条错误,说JS无法读取x上的属性undefined)。

澄清在我的mongoose模式中,创建用户时,它们是使用stripe参数创建的,但默认为空对象{}。只有当我们真正与条纹交谈时才会填满数据。我的系统中有许多beta用户被提供帐户,但没有通过与在前端注册的人相同的过程。这些用户现在需要付费,但他们必须保留他们的帐户。我需要检测用户是否有条带信息,因此我检查req.user对象中的条带参数是否为空对象的原因。

例如,如果我想访问用户保存的卡的最后4位数字,我可以通过这种方式访问​​req.user.stripe.customer.sources.data[0].last4。但是,在尝试访问没有条带数据的用户时,会出现类似于Cannot read property 'sources' of undefined的错误。当req.user.stripe对象为空时,我需要能够处理这样的条件。

javascript node.js lodash javascript-objects
3个回答
0
投票

在访问该属性之前,请使用if语句:

if(req.user && req.user.stripe) { do_your_thing() }

0
投票

这里有三个选项:

  1. 您的对象实际上不是空的,由于某种原因它在控制台上显示为空。
  2. 当你执行console.log时它实际上是空的,但是当你执行_.isEmpty时却没有(正如@Todd Chaffee在评论中所建议的那样;但我觉得这很可疑)
  3. _.isEmpty有一个错误。 (我也发现这个有疑问,但这是可能的)

但是,正如其他人在评论中所说,我认为_.isEmpty不是你想要的。

举个例子来说req.user.stripe.customer.sources.data[0].last4:如果req.user.stripe不是空的,但customer没有定义,或者它是空的,或者它被定义但是sources.data数组是未定义的还是空的,或者等等怎么办?当然,也许所有这些情况在当前的代码中是完全不可能的,但它们总是会吗? _.isEmpty(req.user.stripe)是一个相当脆弱的测试。

一个更安全的替代方案是_.get(req, "user.stripe.customer.sources.data[0].last4"),如果任何这些中间属性为null,它将返回null

...但坦率地说,它有一个更大的结构问题,你试图获取信用卡的最后4位数而不知道你是否首先得到了一个客户。


0
投票

这是一个老问题,但使用_.isNil(object)为我解决了这个问题,如果object为null或为空则返回。

© www.soinside.com 2019 - 2024. All rights reserved.