Uncategorized

Introduction

The #100DaysOfCode is a challenge that aims at making coding a habit. The concept is very simple. Every day, you spend at least an hour doing non-work related programming. The challenge also insists on building projects, and not spending your time doing only tutorials or following courses. You must put what you learned in practice doing real projects. The projects are totally up to you of course, depending on your current skills and/or needs.

You can find more information about the #100DaysOfCode on Alexander Kallaway’s blog post.

The most important thing, in my opinion, is not the habit in itself, though it is very important. The crucial thing to me is being accountable. Hundreds of people are taking this challenge. You have the knowledge that you are not alone. You are also committing to tweet your progress and encourage at least two people each day. There is a level of accountability and connectivity with other people that just make the whole thing so much more appealing to me, and therefore, I feel confident I will be able to do it.

What to build?

That is the bit question that I had. I finished the FreeCodeCamp curriculum, all three certificates. So, I won’t be re-building any of those projects. In my opinion, in order to succeed, the projects I will choose must follow a few rules:

  • Must not take too much time to realise (the goal is to create several projects in that timeframe of 100 days)
  • Must be challenging, but not impossible. I’m not the best developer out there, so I need to choose projects I an actually do. In the mean time, the goal is to push myself, I must choose something outside of my comfort zone.
  • Must be something I would like to do. There are billions of different things I can code, but not every single one will be appealing to me. This is outside of work. **Having fun **is the number one thing I’ll be worried about.

Every single project I will choose to do will have to follow those three rules.

The brainstorm (!!!)

I spent a little bit of time thinking about this, and I cam up with this, so far:

  • War (Card Game)
  • Make a Diary application
  • Make an app using the NASA’s API
  • Belote (French Card Game)
  • A real-time application (socket.io)
  • Something with Bots ?

Here are 6 different projects that I came up with. As you can see, it is still very vague. I only researched the first one a bit deeper (War). In the holidays, I played a lot of card games with my family. That was amazing and this is why I put two cards game in there. The socket.io application is kinda related to my work, but I always enjoyed working with real-time technologies. The rest are just the scratch your own itch type of application.

Will I be able to do all of this in 100 days? Doesn’t matter. The goal is to build an habit of coding every day. The goal is to make sure that you are use to be outside your comfort zone and learn every day.

In each of theses applications I want to build, there are things I don’t have much experience with. The animations that will be required in the cards games for example, never used that before.

So, this is it! I’m personally starting tomorrow (January 3rd). I look forward to see any of you on this path.

As always, feel free to comment and share.
Have a nice day!

Read more

Introduction

I recently started to work with a company as a freelancer. As I got access to the source code, I had the chance to look around at what technologies were used and the particular syntax that the software was written into. The software uses Socket.io for most of the communication client-server. But, as I was looking at the packages used and the code, one of those packages was socketio-file-upload. With this blog post, I’ll try out this package in order to understand better what it is supposed to do. Let’s jump into it!

What is it?

Here is the description we can read from the github link I gave you in the introduction.

This module provides functionality to upload files from a browser to a Node.JS server that runs Socket.IO. Throughout the process, if their browser supports WebSockets, the user will not submit a single HTTP request. Supports Socket.IO 0.9 and 1.0.

The intended audience are single-page web apps, but other types of Node.JS projects may benefit from this library.

Since version 0.4, this module also supports monitoring file upload progress.

Simply put, you can upload files from the client to the server using sockets. I upload a file, without using AJAX or any HTTP requests and it will be saved by the server, in a directory of my choice. Let’s see that!

Begin by create a new directory, and run npm init

Accept all the defaults and then run:

npm install --save socketio-file-upload express pug socket.io

We will connect the router of the socketio-file-upload to express later.

Let’s create a file called server.js

server.js

const express = require('express');
const app = express();
const httpServer = require('http').Server(app);
const path = require('path');
const siofu = require('socketio-file-upload');
const socketServer = require('socket.io')(httpServer);

app.set('view engine', 'pug');
app.set('views', path.join(__dirname, '/public/views'));
app.use(express.static(path.join(__dirname, '/public')));
app.use(siofu.router);

app.get('/', (req, res) => {
    res.render('index');
});

socketServer.on('connection', socket => {
    console.log('Socket connected');
    socket.emit('data', 'Hello World');
    const uploader = new siofu();
    uploader.dir = path.join(__dirname, '/files');
    uploader.listen(socket);
});

httpServer.listen(3000);

Ok, let me explain a little but this code. Most of it is setting a socket.io server with express and and http server. If you don’t know how to do this, I wrote a blog post on getting started with socket.io.

After all this setup, you can direct your attention to the socketServer connection. You can see that we instantiate a new SocketIo-file-upload instance(named uploader). Then, we tell this instance where we want the file to be upload. In this case, I want my files to go to the /files directory. Finally, this instance needs to listen to the socket that just connected.

Note: Socketio-file-upload will NOT create the directory for you if it doesn’t exist. It will throw an error instead.

That is all we need for the back-end. Let’s code our front-end now. We will use several methods from the socketio-file-upload package. First, in your public/views directory, create a file called index.pug :

index/pug

h1 Hello Index
input(type='file')#fileUpload
button#file_button ClickHere
script(src='/socket.io/socket.io.js')
script(src='/siofu/client.js')
script(src='../js/main.js') 

Nothing crazy here, a file input and a button to play around with a method we’ll see in our js file. Then, we link to our 3 different scripts. One for the socket.io library, one for the socketio-file-upload library (both are in our node_modules directory) and one for our custom script called main.js. Let’s see our custom main.js:

//Connection to the socket library
const socket = io();

//This is some classic socket.io event listening
socket.on('data', data => {
    console.log(data);
});

//Here is our socketio-file-upload code
const uploader = new SocketIOFileUpload(socket);

uploader.listenOnInput(document.getElementById('fileUpload'));

uploader.addEventListener('start', (event)=> {
    event.file.meta.extension = 'csv';
});

document.getElementById('file_button').addEventListener('click', uploader.prompt, false);

Ok, here is how we do things. We create a new SocketIOFileUpload instance, with our socket as a parameter. We can use the listenOnInput method on our input file. As you can see, we pass the DOM element that we want to listen to. When we will choose a file, we will trigger this event.

When we do that, we will go back to our server.js file. Our socketio-file-upload instance on the back-end will receive this file (remember that it listens to our socket). Once it receives this file, it will store it in the directory that we specified.

I added some custom code on the start event of the instance. You can write on the event.file object for example. Here, I decided to add extension : 'csv' to the meta object. You can imagine that the possibilities are infinite when it comes to playing with the object.

Lastly, you might have seen on the index.pug that I added a button. The last two lines on main.js adds an event listener to a click event on this button. I use the instance.prompt method (instance being here uploader). This will trigger the opening of the same window you would have on a input file.

That’s it! Those are just a few methods available on the socketio-file-upload package. To learn more, you can visit the very good github socketio-file-upload page. You can peak at the documentation to learn more.

Note: you may wonder what is the difference between this package and the socket.io streams package. The stream package will be user to read files. We create a stream to read the contents of the file. With this package, we do not read it, we store it in our files directory (in our case). We could of course read the file with a socket stream and then upload it. Or upload it, then read it with a stream. Both those packages could be very complementary in my opinion.

Feel free to share and comment!
Have a nice day!

Read more

Introduction

Yesterday, I received my Pavlok. If you are not familiar with it, Pavlok is a device that is focused on changing your habits with the help of electrical stimulus. The most effective way to use it is to zap yourself when you are doing a bad habit. For example, every time I bit my nails, ZAP!

The Pavlok system tries to break the cue-routine-reward path by making the reward not as pleasant. If your habit is rewarded by an electric shock, your brain will associate this habit with pain or discomfort. Because we are creatures of pleasure, we will most likely stop doing this habit.

But, as a part of the Internet of Things trend, Pavlok also allows you to customise its use and add some tweaks. For example, there is a Chrome extension available. If I spend too much time on Twitter, I will get zapped. I also linked my Pavlok with RescueTime. This way, I get notified when I’m being productive (vibrating), when I could do better (beeping) and when I’m being baaaaaad (ZAAAAP !).

Ok, so this is great. But the even cooler part is this: Pavlok has a developer API that allows us to interact with our devices through code. This is what this post is about: getting started with the Pavlok developer API.

Getting started

We will use Node.JS to achieve this. First things first, we need to register our application, the same way we would do with Twitter in order to use its API. To do this, visit this page. Enter the name of your app and for the callback URL, just enter http://localhost:3000/auth/pavlok/result .

Great, now our app is registered. You will get a Client ID and a Client Secret. We will need them in our app.

Create a file, let’s call it test.js.

First, run npm init. Select the defaults and then run npm install --save pavlok-beta-api-login

Let’s write our code!

const pavlok = require('pavlok-beta-api-login');
const ClientID = "YOUR_CLIENT_ID";
const Secret = "YOUR_SECRET_ID";

// Init your device
pavlok.init(ClientID, Secret, {
        verbose: true,
        port: 3000
});

//login
pavlok.login( (result, code) => {
    if(result){
        console.log('Code is', code);
    }
});

// Your device will beep
pavlok.beep();

//Your device will vibrate
pavlok.vibrate();

//This is a pattern
// (Beep & Vibrate) * 3
pavlok.pattern({
"pattern": ['beep', 'vibrate'],
"count": 3
});

And that is all we need!
Run node test.js and your device will respond to the stimuli. You Pavlok application will also receive notifications with the name of your app! Awesome!!

Note that the code will be different if you host your application. On local, this code will be fine. But if you need to host it, you’ll need to change a few things. You can check the npm pavlok wiki page to get more information on how to do this.
You can get more information about the device on the Pavlok website and more information on the Developer API can be found on the Pavlok Developer API

I’ll post more informations as I keep playing with it. But this is enough to get you started. Have fun!

Feel free to comment and share!
Have a nice day!

Read more

Introduction

In this article, we will see very simply how to use namespaces with socket.io. Namespaces allow us to group sockets based the page the user visits. In our example, we will use three different groups. One group will contain the sockets in the index page ‘/’, another in the ‘/products’ page and another one in the ‘/contact’ page.

First things first, create a directory that will hold our project. Then, run npm init. Accept the defaults and then install our needed dependencies with :

npm install --save express socket.io 

Ok, now create 4 files, server.js, index.html, products.html, contact.html.

Let’s start with our server.js:

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

const app = express();
const server = http.Server(app);
const ioServer = require('socket.io')(server);

//Namespaces Socket.io
const indexUsers = ioServer.of('/');
const productsUsers = ioServer.of('/products');
const contactUsers = ioServer.of('/contact');

// Express file rendering
app.get('/', (req,res)=> {
    res.sendFile(__dirname + '/index.html');
});

app.get('/products', (req,res)=> {
    res.sendFile(__dirname + '/products.html');
});

app.get('/contact', (req,res)=> {
    res.sendFile(__dirname + '/contact.html');
});

// socket.io logic

//Index page sockets
indexUsers.on('connection', socket => {
    socket.emit('connectionMessage', 'Welcome to the index page');
});

//Products page sockets
productsUsers.on('connection', socket => {
    socket.emit('connectionMessage', 'Welcome to the products page');
});

//Contact page sockets
contactUsers.on('connection', socket=> {
    socket.emit('connectionMessage', 'Welcome to the contact page');
});

server.listen(3000);

Quick explanation: We begin by initialising our socket.io server like usual. We use express to server our three html files. Nothing crazy so far. But notice that we define three variables with the of() method on our ioServer. This tells socket.io that depending on the connection made in the front-end, we will group sockets differently. We are then able to use the emit event (or the on event) on those namespaces like any other socket. Let’s see how our three html files will look.

They all look very similar, but I wanted to make sure that everything was clear.

index.html

<!DOCTYPE html>
<html>
    <head>
        <title>Index Page</title>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.7.1/socket.io.js"></script>
    </head>
    <body>
        <h1>Welcome to the Index Page</h1>
        <h3 id="message"></h3>
        <script>
            const socket = io('/');

            socket.on('connectionMessage', message => {
                document.getElementById('message').innerHTML = message;
            });
        </script>
    </body>
</html> 

products.html

<!DOCTYPE html>
<html>
    <head>
        <title>Products Page</title>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.7.1/socket.io.js"></script>
    </head>
    <body>
        <h1>Welcome to the Products Page</h1>
        <h3 id="message"></h3>
        <script>
        const socket = io('/products');

        socket.on('connectionMessage', message => {
            document.getElementById('message').innerHTML = message;
        });
        </script>
    </body>
</html>

contact.html

<!DOCTYPE html>
<html>
    <head>
        <title>Contact Page</title>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.7.1/socket.io.js"></script>
    </head>
    <body>
        <h1>Welcome to the Contact Page</h1>
        <h3 id="message"></h3>
        <script>
            const socket = io('/contact');

            socket.on('connectionMessage', message => {
                document.getElementById('message').innerHTML = message;
            });
        </script>
    </body>
</html>

Alright, the structure of those files is exactly the same. Standard html, with a script for the socket.io CDN. Then, two headers, a h1 that tells us on which page we are on, and an h3 with the id of message. In our script, the socket reacts to the connectionMessage event by putting the message in our h3.

Can you spot the difference between those files?
The definition of our socket is different. The argument in our io() function is what creates the namespace. In combination with the variables definition we did in server.js, we created separated groups of sockets that can emit and respond to socket events independently from one another. Pretty cool huh?

And that’s it! This is a very simple beginning, just to make you understand how this thing works. Of course, this opens a lot of different possibilities. Go ahead and experiment!

As always, feel free to comment or share.

Have a nice day!

Read more

As part of my freelancing journey, I have recently being asked to perform a technical test. The content of that test was as follow:

  • Use Javascript on both the front-end and back-end.
  • Users must be notified when another user connects or disconnects
  • The application will send an offer every 15 seconds. This offer will have a random price and can be accepted by the users. After, 30 seconds, that offer expires.
  • Users must be notified when an other user accepts an offer.
  • Users will be authenticated by their IP addresses.
  • Users can see the offers they accepted in the past and the other users connected.
  • Use whatever technology you see fit, no restriction (must be Javascript though)
  • Everything must be in real-time.

Ok, so this was the test. Build a web application that follows those stories. The real-time part is obviously crucial here, and it makes perfect sense. As a potential buyer, I can only buy offers that have not been accepted by another buyer. So, the updates on the offers must be done in real-time. Same thing concerning the connected users. Everybody will have the same information at the same time. One user can’t be shown connected for one user, and disconnected for some.

Now, the previous accepted offers was an interested challenge. Indeed, this feature will change for every single user. Everybody will have accepted different offers. One offer can only be accepted by one user at a time. This part of the application was the most difficult to solve for me. Let me give you a quick overlook of how I did it.

First, what technologies should I use? The real-time concept made me choose socket.io. I honestly haven’t looked around for other libraries that would allow you to use WebSocket in this way. WebSocket is a web protocol that allows the client and the server to communicate to one another (in real-time). You can find more information about socket.io here.

At the time, my knowledge about this library was kind of limited. I knew the basics, but the idea of sockets sending data to only certain sockets was new to me.

If you use the socket.emit() method, the socket will send whatever data it has in its argument to ALL the other sockets, including itself. That is the perfect function for a chat room for example. If a send a message, I want everyone to see it, including myself. Great, but in this case, I’m only looking for that when I display the offers. The server sends the available offers for everybody. What about the other use cases?

Let’s talk about the notifications first. The connection, disconnection of a user, and the user accepting an offer. Here, I want to send the data to everybody except the user that is responsible for that action. In socket.io, it means the socket responsible broadcasts the data to the other sockets. Like this:

socket.broadcast.emit('notification', 'User just connected');

Done! I just joined the party, but only the other participants have been notified. Problem solved.

Next, the accepted offers issue. This one was tougher. I couldn’t get my head around this. How do you send the concerned data to the only socket that needs it? I tried to use the socket.broadcast.to(socketID) method. But that didn’t work. I think this method is only reserved to send data to other sockets. And in this case, I was retrieving the accepted offers from a database, and sending that to the socket. the socket was sending the data to ITSELF. And then, after much research, I found a way to do it.

Rooms

That’s right. You see, in socket.io, you can group sockets in rooms. Think about chat rooms, it works the same! When I join a room in a chat application, I won’t receive the messages from other rooms I’m not a part of. Well, that’s exactly what I needed to do here! Create a room for each user, and broadcast the data of their offers to their room of one. I needed to make sure that each room would have a unique name, so different users would not have colliding room names (therefore wrong data concerning offers) by accident. Well, remember the list of user stories. Users are recognized by IP addresses, so:

//get IP address of the socket at the connection
const userIP = socket.handshake.address;
//create unique room
socket.join(userIP);

Then, in order to send data to this particular socket, I used:

io.sockets.in(userIP).emit(data);

And voila! Use the io global to get all sockets and filter the existing rooms. I tell the application to only send the data to the sockets in that particular room. And because I used the IP addresses, there is only one member in each room, and no risk of sending data to the wrong person.

If you want to see the application live, it is hosted on Heroku here.

As usual, I’m sure there is a better way to do this, more elegant way. But, the first step is to make it work. It does! I would probably need more intel about the WebSocket protocol and the socket.io library. But it was a really fun little project to work on.

As always, thank you for your time, and feel free to share and comment!

Have a nice day!

Read more

I love Open Source. I committed myself to learn with Open Source when I started this journey as a developer. I benefited immensely thanks to the community. The tools, the courses, the people… But, one thing I have struggled with is, how do I give back? How can I help Open Source like it has helped me?

 

The first steps to contribution to an Open Source project are complicated. You may have read about some stories already. Mine is not different. As of today, my contributions include some translation for the FreeCodeCamp repository and some CSS syntax stuff for a project that I forgot… I just replace some ‘-‘ by ‘_’ . Nothing really big, but you have to start somewhere.

 

When you are looking to contribute for the first time, I believe the most important thing is the community you will be part of. Are they helpful? Do they welcome new contributors? Do they help you overcome difficulties or just dissuade you? These are very important questions because you will most likely participate in a project with at least thousands of lines of code. It can be overwhelming. If the people maintaining the project have no interest in helping you making the project grow, well, maybe you should look for a better place, especially if you are a beginner.

 

The second thing that you should consider is, do you actually care about the project you want to contribute to? I remember the first contribution I made, the CSS thing. Well, I can’t even remember the name… I think I found it on up-for-grabs and just found a easy enough  issue. People were nice, helpful and all but… I just didn’t really care about the repository. I just wanted to contribute. So, if you are a beginner in the world of Open Source and you want to contribute, find a project that you use all the time, or something that really excites you and emerges yourself in it.
Finally, and I often come back to this, you will have to overcome the imposter syndrome. Those projects seems like well-oiled machines. You’ll be scared to fuck things up. The thing is, Open Source NEEDS you, it NEEDS us. Developers who care about those things. Open Source is amazing, and we can all be a part of that. You don’t have to spend 20 hours a week on GitHub, solving issues. It’s all up to you. Whatever time you want to invest.

 

Be patient, you will find your place, your community. And you will make software better.

 

As for me, I decided to concentrate my effort on Calypso. The Javascript and API powered WordPress.com. I chose this project because it has everything I want. As a freelancer, making website with WordPress will become a big occupation of mine. As a NodeJS and React fan, Calypso is a project I would love to learn with and contribute to. You can find the repository here

 

I’m actually off to spend some time in the code to try solving an issue. It’s difficult, it will take time for me to figure out. But that’s the best part.

 

Have fun.
As always, feel free to share and comment.
Have a nice day.
Read more

Introduction

In this article, we will make a very simple API (Application Programming Interface) with Express and Mongoose. We will create a program that will talk to a database. What we do with the database will be defined by the routes and the method we enter. An API is only on the back-end side of the application. We will not take care of connecting this API to the front-end (but you could do it without a problem).

To achieve this, we will use Express, Mongoose and Postman. Mongoose is an ODM (Object Document Mapper).It makes it easier to connect and interact with a mongodb database.
Postman is a tool that allows you to test and run your APIs. It’s a really great tool that can be found here.

A- Database and model

First let’s start by installing the packages we’ll need to interact with the database. In order to install MongoDB and use it on the command line, you can follow the tutorials here.

When this is done, create a new directory and add two files: model.js and index.js.
First things first, let’s install our dependencies, with this command:

npm install express mongoose body-parser

In model.js, we will create a Schema. A Schema represents the data you want to store in your database. A Schema takes a JSON Object. Like this:

const mongoose = require('mongoose');
let Schema = mongoose.Schema;

let AlbumSchema = new Schema({
	title: String,
	year_release: Number,
	artist: String,
	genre: String
});

let Album = mongoose.model('Album', AlbumSchema);

module.exports = Album;

We require the mongoose package. Then, I create a variable Schema that will allow me to instantiate a new Schema. this application will store albums, so I give my Schema the name AlbumSchema. As you can see, my schema takes a JSON object with 4 keys. Each key has a value that corresponds to its data types. You can find more information on the mongoose data types here. For this example, three keys are String, one is Number.
The mongoose Schema needs to be stored into a model. We do this by calling the model() method. It takes two arguments, the first is a string and defines the name of your model. The second argument is the schema concerned. Finally, I export this model.
Great, now let’s move on to our routes

B- Database Connection And Routes

Let’s open our index.js and require our dependencies:

const mongoose = require('mongoose');
const Album = require('./model');
const express = require('express');
const jsonParser = require('body-parser').json;

const app = express();
app.use(jsonParser());

app.listen(3000, () => {
	console.log('Listening on port 3000');
});

Nothing crazy here. I require mongoose, my Album model, express and body-parser. We use the body-parser to transform our requests bodies to JSON. It makes it a lot easier to work with data. Next, I instantiate a new Express application and use our parser in the middleware. Finally, I tell the app to listen to the port 3000.

Next, let’s connect to our database. We are going to use the local machine. Here is what it will look like. Add this to your index.js

//connect to db
mongoose.connect('mongodb://localhost/mongoose-test');
const db = mongoose.connection;

db.on('open', () => {
	console.log('You are new connected to the database');
});

db.on('error', (err) => {
	console.log('An error occured!', err);
});

The mongoose.connect() takes the url of the database. On your local machine, it will have this form mongodb://localhost/ . Then, you enter the name of your database. Here, I chose mongoose-test.
To be able to interact with your database, you need to start the mongo deamon. It is included with the MongoDB installation that you did earlier. All you need to do is open a new terminal window and enter the command:

mongod

Now, if you start your app with node index.js(in a different terminal window). You will see:

Listening on port 3000
You are new connected to the database

Awesome!
Let’s create our routes!
Here is what I chose to do: Two GET routes, one to get all the albums of the database and an other one to get an album based on its id. There is one POST route to create a new album and a DELETE route to delete an album based on its id. You can of course create more if you wish. Here is what it looks like for me.

index.js

// GET all albums in database
app.get('/', (req, res) => {
	Album.find({}, (err, albums) => {
		if(err) return next(err);
		res.json(albums);
	});
});

//GET album by id
app.get('/album/:id', (req, res, next) => {
	let id = req.params.id;
	Album.findById(id, (err, album) => {
		if(err) return next(err);
		if(!album){
			res.json({message: 'No album with this ID in the DB!'});
		}
		res.json(album);
	});
});

//POST new album
app.post('/album', (req, res) => {
	let album = new Album({
		title: req.body.title,
		artist: req.body.artist,
		year_release: req.body.year_release,
		genre: req.body.genre
	});
	album.save();
	res.end('The album ' + req.body.title + ' has been saved');
});

//DELETE album by id
app.delete('/album/:id', (req, res, next) => {
	let id = req.params.id;
	Album.findById(id, (err, album) => {
		if(err) return next(err);
		if(!album){
			res.end('No Album with this ID!');
		}
		album.remove();
		res.end('Album has been deleted');
	});
});

As you can see, we use the findById method on the model to find a particular document. The id is automatically added by mongoose, you do not have to take care of that. To find all documents, we give the find method an empty object. To get the id from the url, we use the express req.params property.
Let’s see this in action! Launch Postman.
At the top, you can find the url bar and the method. In our case, the URL will be http://localhost:3000/ .
You can start by adding an album of your choice by choosing the POST method and the url http://localhost:3000/album. Then, select Body in the sub-menu. Pick raw in the radio boxes and choose application/json in the dropdown. Now, enter a JSON object with the properties specified in our model (year, title, artist, genre) and press Send. Our API will process and add this document to the database.
If you choose GET method and the ‘/’ path, you will be able to see all the albums you add.
Note:the id you specify to see a certain album or delete must be the one added by the MongoDB database. It’s the value you see in the key _id. It has this form :

"_id": "5822fd543990280b9cfded04"

Well, there you have it! A very simple API that should get you started with mongoose.
Feel free to ask questions and tell me what you think.
Have a nice day!

Read more