在NodeJs中读取JSON文件

时间:2017-11-23 16:00:40

标签: json node.js

我有一个包含此内容的小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);

但我认为数据库没错。我在哪里弄错了??

3 个答案:

答案 0 :(得分:2)

非常确定req.params.idString。试试:

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函数结束时