FAQ: Introduction to Node.js - The Util Module

This community-built FAQ covers the “The Util Module” exercise from the lesson “Introduction to Node.js”.

Paths and Courses
This exercise can be found in the following Codecademy content:

Learn Node.js

FAQs on the exercise The Util Module

There are currently no frequently asked questions associated with this exercise – that’s where you come in! You can contribute to this section by offering your own questions, answers, or clarifications on this exercise. Ask or answer a question by clicking reply (reply) below.

If you’ve had an “aha” moment about the concepts, formatting, syntax, or anything else with this exercise, consider sharing those insights! Teaching others and answering their questions is one of the best ways to learn and stay sharp.

Join the Discussion. Help a fellow learner on their journey.

Ask or answer a question about this exercise by clicking reply (reply) below!
You can also find further discussion and get answers to your questions over in Language Help.

Agree with a comment or answer? Like (like) to up-vote the contribution!

Need broader help or resources? Head to Language Help and Tips and Resources. If you are wanting feedback or inspiration for a project, check out Projects.

Looking for motivation to keep learning? Join our wider discussions in Community

Learn more about how to use this guide.

Found a bug? Report it online, or post in Bug Reporting

Have a question about your account or billing? Reach out to our customer support team!

None of the above? Find out where to ask other questions here!

Hi, I have a question.

In task 4 it says “inside of then(), log to the console”

The ${nickname} is ${mi} miles long!

But doesn’t it have to be: The ${track.nickname} is ${track.mi} miles long!

Thanks for any help

3 Likes

I think you’re right, it should be console.log(The ${trail.nickname} is ${trail.miles} miles long!) since the mi and nickname variables were only defined in the callback function that we’re trying to replace.
Besides, it’s not possible to pass this checkpoint using the variables.

2 Likes

This lesson somewhat confused me as to how the final code should look like if we make use of the promisify method. Are the initial function declaration getTrailDistance() (written as it is), the callback function and the promisified function suppose to cohabit together on the same file? Since we need to write const getTrailDistancePromise = util.promisify(getTrailDistance), I’m guessing we do need the initial getTrailDistance() to remain unchanged, but if I try to remove the callback function, I obviously get a reference error because we use callback in getTrailDistance() which is not defined anymore.

I assume that the aim is to only have the promisified function in the file and get rid of the old code, but I don’t see how to do that without getting reference errors. And the getTrailDistance() is referring to the callback which becomes obsolete when we decide to convert the callback to a promisified function, so why would we want to keep the code inside getTrailDistance() as it is?

4 Likes

I figured it out!!!
The instructions were not clear at all.
I had to refer to my notes on Promises from the Intermediate Javascript course.

Basically, the key thing to understand is that nickname and mi are keys inside of the resolved value of the Promise getTrailDistancePromise (which you created in the exercise). Also, mi isn’t really the key, it’s actually called miles.

In order to access this data (the resolved value of the Promise), you have to pass it in to the .then() as a function. This is in the form of .then((resolvedValue) => console.log(resolvedValue));. If you run that line of code, it will print out for you the full data. From there, you can construct the console.log() statement the exercise is asking you to.

This is the correct answer below. Note that you can rename x using any variable name. It basically refers to the resolved value of the promise, and simply passes it along to the success handler function nested inside of .then(). (This is explained in the Intermediate Javascript course).

getTrailDistancePromise('North Country').then((x) => console.log(`The ${x.nickname} is ${x.miles} miles long!`)).catch();
3 Likes

I do not understand how to create a new post, so I put my question as a reply… could somebody explain me which is the advantage of promisify the function? It was working without it. It seems just that we are adding extra useless lines of code. I am super lost with this promise thingy :S

1 Like

Thanks for posting I did the vanilla JavaScript years ago and was really struggling with the explanations on this one!

1 Like

I was wondering the same. I really don’t understand the purpose of it if we still need to keep the old function with the callback…

Still no answer to this question?

I have just completed this exercise too, and while I understand how the promisfy simplifies the code I cannot figure out how to get it to work by removing the old callback() function. I can remove the function completely, but if I then go to remove the callback(null, foundTrail) or and transform the callback(new Error(‘Trail not found!’)) from the getTrailDistance function the program does not output anything (but also does not display any error messages).

Fairly poorly written excercise considering how much of a mental effort understanding promises vs call back functions can be.

Any moderators / codecademy staff able to clarify here how we can remove the redundant callback function so it is just the promisfy?

1 Like

I believe the exercise keeps the old callback() function in order to validate the output of the exercise. I took some time to realize.

I agree, after "promisifying’ the function getTrailDistance, the old callback() function is not necessary anymore.

getTrailDistancePromise('North Country')
  .then((x) => {
    const mi = x.miles;   
    const nickname = x.nickname;
    console.log(`The ${nickname} is ${mi} miles long!`)
  })
  .catch((error)=>{
    console.log('Trail not found!',error)
  });
1 Like

I struggled with this exercise, and the hint for step 4, “Use the example in the narrative if you’re unsure about the syntax.” is not any help since the narrative example doesn’t involve using an object as the argument for the .then. Explaining that in the hint would be a lot more useful versus looking at the solution. I’m curious whether this is the best place to make this comment or whether it should be addressed as a bug? Also curious whether Codecademy responds to this type of comment here or in bug reports?

It’s a poor excercise imo (well step 4 specifically). Surely better practice would be to encourage re-writing the initial functions to incorporate modern promise syntax (async/await) or (new Promise resolve/reject). Feel i’ve wasted my time on this because it doesn’t appear to save on any code reduction either

1 Like

Hi, i don’t understand the use of “if (trails.hasOwnProperty(trail))” line 8 because when i look into the trails.js files there is no property called trail, and without .hasOwnProperty(trail) the function is still good

1 Like

This Exercise needs to be reworked. It’s not easily understandable and has confusing conventions.

3 Likes

I completed this example but then also attempted to call this getTrailDistancePromise (promisified function) using await but I get the message that await is only valid in async functions. Doesn’t promisify make an asynchronous function?

I’m confused as to why this does not work.

try {
let trail = await getTrailDistancePromise(‘North Country’);
console.log(Thee ${trail.nickname} is ${trail.miles} miles long!);
} catch (error) {
console.error(Error, error);
}

The confusion that arises from this exercise is the lack of explanation about why to use promisify in the first place. Lots of the posts on here suggest ‘replace’. None of the original code is being replaced, that is not the purpose of Promsisify. Its purpose is to add an extra layer.

Here’s a real world example.

You might want to use a function that exisits in the ‘fs’ library called ‘fs.readFile’. Some light research reveals that fs.readFile uses an error-first callback. We can use Promisify to convert fs.readFile for our own purposes into a promise. The three key advantages are: -

  1. Easier to understand code;
  2. Ability to use await with callback-based APIs;
  3. Avoiding nesting issues.

I too struggled with this but 20 minutes of web-search and a Copilot search on

what is the point of node util.promisify?

helped resolve my confusion.

1 Like