尝试测试获取所有路由时出现“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)
);
我建议在查询时使用async
和await
。
【讨论】:
以上是关于尝试测试获取所有路由时出现“TypeError:无法读取 null 的属性 '1'”?的主要内容,如果未能解决你的问题,请参考以下文章
获取错误:在角度 js 中进行单元测试时出现 $injector:modulerr 模块错误
编写 Karma-Jasmine 单元测试用例时出现“错误:没有路由器提供程序”