我有一个包含此内容的小JSON文件
{
"users": [
{
"id": 1593,
"name": "Foo Bar"
}
]
}
我想通过使用filesystem模块来阅读这些内容。所以我的应用程序看起来这个
const fs = require('fs');
const express = require('express');
const app = express();
app.get('/users/:id', function (req, res) {
fs.readFile('./userDb.json', 'utf8', function (err, data) {
var json = JSON.parse(data);
var users = json.users;
console.log(users[0].id); // returns 1593
console.log(req.params.id); // returns 1593
var userObj = null;
for(var i = 0; i < users.length; i++){
var currentUser = users[i];
console.log(currentUser.id); // returns 1593
if (currentUser.id === req.params.id) { // this should be fine 1593 === 1593
userObj = currentUser;
break;
}
}
console.log(userObj); // returns undefined
res.render('users', {
user: userObj
});
});
});
app.listen(3000, function () {
console.log('Server running on port 3000');
});
当我将其作为参数传递时,日志将始终返回1593,但是当我想渲染我的手柄模板时,分配的对象为空。
userObj
为空,即使在尝试此代码时也是如此
var userObj = users.find(u => u.id === req.params.id);
但我认为数据库没错。我在哪里弄错了??
答案 0 :(得分:2)
非常确定req.params.id
是String
。试试:
const userObj = users.find(u => u.id === Number(req.params.id));
如果您对此有疑问:
console.log(
`First value : ${v1} - ${typeof v1}`,
`Second value : ${v2} - ${typeof v2}`,
);
答案 1 :(得分:1)
请替换
if (currentUser.id === req.params.id)
带
if (currentUser.id == req.params.id)
由于req.params.id是一个字符串而且currentUser.id是一个数字,因此无法严格比较它们。 但是,非严格的比较应该可以正常工作。
答案 2 :(得分:-1)
console.log(userObj); // returns undefined
在readFile回调之后调用,这是一个asynchronous non-blocking event! 你必须移动你的:
res.render('users', {
user: userObj
});
在readFile函数结束时