peterHasemann
peterHasemann

Reputation: 1590

Object is null when reading from JSON in NodeJs

I got this server code running

    const fs = require('fs');
    const express = require('express');

    const app = express();

    app.get('/profile/:id', function (req, res) { // A route with a parameter
      res.render('profile', {
        user: getUserById(req.params.id)
       });
    });

    app.listen(8888, function () {
      console.log('Server running on port 8888');
    });

function getUserById(userId){
  fs.readFile('./database.json', 'utf8', function (err, data) {
    var json = JSON.parse(data);
    var users = json.users;
    return users.find(u => u.id === userId);
  });
}

And when calling the route, the function getUserById gets called. In my database, I have this data

{
  "users": [
    {
      "id": 2312,
      "name": "Foo Bar",
    }
  ]
}

so the route would be /profile/2312 for example.

req.params.id returns the value 2312.

In the loop at var currentUser = users[0]; currentUser.id will return 2312 and the parameter passed in is 2312.

But when assigning user = currentUser; the object user is null.

Do I miss a module? Is the code wrong?

Upvotes: 0

Views: 557

Answers (1)

Ankit Bahuguna
Ankit Bahuguna

Reputation: 588

user object is null because you are returning it before your code actually reads the file.

 fs.readFile('./database.json', 'utf8', function (err, data) { }

fs.readFile is asynchronous, so in order to return correct value you have to move the return statement inside fs.readFile block.

Also since getUserById is calling an asynchronous function, you have to call res.render after 'getuserById' finishes executing.

const fs = require('fs');
const express = require('express');

const app = express();

app.get('/profile/:id', getUserById);

app.listen(8888, function () {
  console.log('Server running on port 8888');
});

function getUserById(req,res){ // Get a user from the database by userId

  const userId = req.params.id;
  fs.readFile('./database.json', 'utf8', function (err, data) { 
    var json = JSON.parse(data); // get the JSON object
    var users = json.users; // convert the object to a user array
    var match = users.find(u=>u.id.toString()===userId.toString());
   //Call render after the asynchronous code finishes execution. 
     res.render('profile', {
    user: match
   });
  });


}

How does Asynchronous Javascript Execution happen? and when not to use return statement?

Upvotes: 3

Related Questions