JavaScript(Node.js)中如何设置对象可空以避免null属性读取报错
问题原因
- 你触发
TypeError: Cannot read property 'doors' of null报错的根本原因是:当没有匹配到符合doors.id=doorId条件的文档时,findOne会返回null而非抛出错误,你的原有逻辑仅处理了err异常分支,没有判断data是否为空的情况,直接访问data.doors就会触发空指针报错。 - 你之前修改查询条件为
!doors.id的操作逻辑完全错误,相当于查询不存在doors.id字段的文档,自然所有请求都返回404。
修复方案
你只需要在原有逻辑中补充空值判断分支,匹配不到数据时直接返回404即可,修改后的代码如下:
Data.findOne({ '_id':'6182544c20d538aefe49def0', 'doors.id':doorId }, { 'doors.$':1 }, function(err, data) { // 先处理系统异常 if (err) { return res.status(500).send('Server Error') } // 补充空值判断:无匹配数据直接返回404 if (!data || !data.doors || !data.doors.length) { return res.status(404).send('No Matching Door Found') } // 走到这里说明一定有匹配的door数据,无需担心空指针 if (data.doors[0].status === 'open') { return res.status(401).send('Door already unlocked') } res.status(200).end() })
补充说明
- 新增的空值判断依次校验了查询结果是否存在、doors属性是否存在、doors数组是否有值,覆盖了所有无匹配数据的场景,完全避免空指针报错。
- 原有逻辑把查询错误和无匹配数据都返回404不符合HTTP规范,这里把系统异常修改为返回500,如果你不需要区分可以自行调整。
- 如果你使用TypeScript开发,只需要在对应的数据模型接口定义中,将doors设置为可选数组类型即可满足可空类型的要求,示例定义如下:
interface IData { _id: string; // 加问号标识为可选属性 doors?: Array<{ id: string; status: 'open' | 'closed' }> }
内容的提问来源于stack exchange,提问作者SeventhWarhawk
相关产品推荐
相关产品推荐

