You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 11:36:05