尝试测试获取所有路由时出现“TypeError:无法读取 null 的属性 '1'”?

Posted

技术标签:

【中文标题】尝试测试获取所有路由时出现“TypeError:无法读取 null 的属性 \'1\'”?【英文标题】:I get "TypeError: Cannot read property '1' of null" when trying to test get all route?尝试测试获取所有路由时出现“TypeError:无法读取 null 的属性 '1'”? 【发布时间】:2021-12-02 11:12:42 【问题描述】:

我正在构建一个登录系统。当我尝试从 mysql DB 获取所有用户来测试系统时,我得到了

TypeError: Cannot read property '1' of null
    at firstchar (E:\vs work\mysql signup login system\node_modules\body-parser\lib\types\json.js:176:37)
    at parse (E:\vs work\mysql signup login system\node_modules\body-parser\lib\types\json.js:79:19)
    at E:\vs work\mysql signup login system\node_modules\body-parser\lib\read.js:121:18
    at invokeCallback (E:\vs work\mysql signup login system\node_modules\raw-body\index.js:224:16)
    at done (E:\vs work\mysql signup login system\node_modules\raw-body\index.js:213:7)
    at IncomingMessage.onEnd (E:\vs work\mysql signup login system\node_modules\raw-body\index.js:273:7)
    at IncomingMessage.emit (events.js:388:22)
    at endReadableNT (internal/streams/readable.js:1336:12)
    at processTicksAndRejections (internal/process/task_queues.js:82:21)

怎么了????

这是我的代码**

router.get('/', (req, res) => 
  db.query('SELECT * FROM users', 
  (err, rows, fields) => 
    if (err) 
      throw err
     
      res.send(rows)

    
  )
);

//* sign up route 

router.post('/sign-up', userValidation.validateRegister, (req, res, next)=>
  db.query(
    `SELECT * FROM users WHERE LOWER(user_name) = LOWER($db.escape(req.body.user_name))
      OR LOWER(email) = LOWER ($db.escape(req.body.email));`,
    
       (err, result) => 
        if(result.length) 
          return res.status(409).send(msg:'already in use email/username')
         else 

          // ? username is available => hash the pass

          bcrypt.hash(req.body.password, 10, (err, hash)=>
            if(err)
              return res.status(500).send(msg: err)
             else 

              let email = req.body.email

             //? has hashed pw => add to database 

             db.query(
               `INSERT INTO USERS (id,user_name,email,password,registrated) 
                    VALUES ('$uuid.v4()', $db.escape(req.body.user_name),'$email', 
                    $db.escape(hash), now())`,
                (err, result) =>
                  if (err) 
                    throw err
                    return res.status(400).send(msg: err)
                  

                  return res.status(201).send(msg: "Registered!!")
                
                


               )
      
            
          )
        
      
      
      )

)

【问题讨论】:

这部分代码似乎没有发生错误 你能解释一下吗? 因为您没有尝试访问对象的antry(在这种情况下为null)。它可能发生在回调函数中。在几个点尝试 console.log()。这样你就可以知道代码运行到哪一部分了 【参考方案1】:
router.get('/', (req, res) => 
  db.query('SELECT * FROM users', 
  (err, rows, fields) => 
    if (err) 
      throw err
     
   if(!rows) throw 'rows not found !'
      res.json(rows);

  )
);

【讨论】:

给了我同样的 TypeError: Cannot read property '1' of null 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。您可以在帮助中心找到更多关于如何写好答案的信息:***.com/help/how-to-answer。祝你好运?【参考方案2】:

每个查询都是一个承诺。您需要一些时间才能获得从数据库中检索数据的请求结果。在您的代码中,您尝试发送rows,然后再将它们作为响应返回。所以你需要等到从 db 取回数据。

router.get('/', async (req, res) => 
  const result = await db.query('SELECT * FROM users', (err, rows, fields) => 
    if (err) 
      throw err
     
  )
  res.send(result)
);

我建议在查询时使用asyncawait

【讨论】:

以上是关于尝试测试获取所有路由时出现“TypeError:无法读取 null 的属性 '1'”?的主要内容,如果未能解决你的问题,请参考以下文章

获取错误:在角度 js 中进行单元测试时出现 $injector:modulerr 模块错误

尝试在 js 中附加路由参数时出现问题

尝试输入反应应用程序路由时出现 404

编写 Karma-Jasmine 单元测试用例时出现“错误:没有路由器提供程序”

尝试在 debian linux 上运行 ember 测试时出现奇怪的错误

尝试发送测试版本时出现 TestFlight 和 iOS 奇怪错误