Like any kind of apps, there are difficult issues to solve when we write Node apps.
In this article, we’ll look at some solutions to common problems when writing Node apps.
Looping Through Dynamic Test Cases with Jest
We can use the tests.each
method to loop through each tets.
For instance, we can write:
test.each([[4, 5, 9], [1, 2, 3], [2, 3, 5]])(
'add(%i, %i)',
(a, b, expected) => {
expect(a + b).toBe(expected);
},
);
The first argument is the items we want to pass into each test.
The nested array entries are the parameters for the callback.
The 2nd argument is the name of each test.
The 3rd is a callback to let the arguments and run our expectations.
Setting Default Headers with Supertest
We can create a header we can use with our test.
Then we can pass it into the set
method.
For instance, we can write:
const request = require("supertest");
const baseUrl = 'http://localhost';
request = request(baseUrl);
const commonHeaders = { authorization: "abc" };
describe("testing", () => {
it.should('present authorization header to server', (done) => {
request.get('/foo')
.set(commonHeaders)
.set({ foo: "bar" })
.expect(200, done)
})
})
commonHeaders
has the shared headers between multiple tests.
We just pass that into the set
method.
Then we can pass other headers into the set
method that are specific to the test.
Read a File Synchronously in Node.js
To read a file synchronously with Node, we can use the readFileSync
method.
For instance, we can write:
const fs = require('fs');
const content = fs.readFileSync('file');
console.log(content);
We just pass in the path to the file and the content will be returned.
Base64 Encode a JavaScript Object
We can base64 encode a JavaScript object by converting it to a string with JSON.stringigy
.
Then we can call Buffer.from
to convert it to a buffer and then call toString
to convert it to a base64 string.
For instance, we can write:
const str = JSON.stringify(obj);
const objJsonB64 = Buffer.from(str).toString("base64");
Buffer.from
converts the stringified JSON object to a byte stream.
Then we call toString
with the 'base64'
argument to convert it to a base64 string.
Mongoose Populate Embedded
We can call populate
on embedded documents with Mongoose if we define a schema with the related schemas.
For instance, if we have:
const UserSchema = new Schema({
name: String,
friends: [{ type: ObjectId, ref: 'User' }]
});
Then we have a self-referencing schema since friends
is referencing another User
document.
Now we can call populate
with friends
by writing:
User.
findOne({ name: 'james' }).
populate({
path: 'friends',
populate: { path: 'friends' }
});
We call populate
the friends
to get friends.
And we can use the populate
property to get friends of friends.
Running a Function Everyday
We can run a function in a scheduled manner by using the node-schedule
package.
For instance, we can write:
import schedule from 'node-schedule'
schedule.scheduleJob('0 0 0 * * *', () => {
//...
})
We run the schedule.scheduleJob
to run the callback with the scheduled specified by the string.
It takes a string in that specifies the schedule in the same way as a cron job.
The first number is the second.
The 2nd is the minute.
The 3rd is the hour.
The 4th is the day of the month.
The 5th is the month.
The 6th is the day of the week.
We specify the hour, minute, and second to specify when it’ll run in the day.
Then the rest are asterisks to that it’ll run every day.
We can also specify the date instead of a cron
format string.
For instance, we can write:
const schedule = require('node-schedule');
const date = new Date(2020, 0, 0, 0, 0, 0);
const j = schedule.scheduleJob(date, () => {
console.log('hello');
});
Then the callback only runs on the given date.
We can also set recurrence rules.
For instance, we can write:
const schedule = require('node-schedule');
const rule = new schedule.RecurrenceRule();
rule.minute = 30;
const j = schedule.scheduleJob(rule, () => {
console.log('half hour job');
});
We use the schedule.RecurrenceRule
constructor to create a rule.
We set the minute
in the example above.
But we can also set the second
, hour
, date
, month
, year
, and dayOfWeek
.
Conclusion
node-schedule
is a useful scheduler package.
We can set headers for tests with supertest.
Jest can define and run tests dynamically.
MongoDB can reference related documents.
We can convert JavaScript objects into base64 strings.