Skip to main content

--description--

The following challenges will make use of the chat.pug file. So, in your routes.js file, add a GET route pointing to /chat which makes use of ensureAuthenticated, and renders chat.pug, with { user: req.user } passed as an argument to the response. Now, alter your existing /auth/github/callback route to set the req.session.user_id = req.user.id, and redirect to /chat.

socket.io@~2.3.0 has already been added as a dependency, so require/instantiate it in your server as follows with http (comes built-in with Nodejs):

const http = require('http').createServer(app);
const io = require('socket.io')(http);

Now that the http server is mounted on the express app, you need to listen from the http server. Change the line with app.listen to http.listen.

The first thing needing to be handled is listening for a new connection from the client. The on keyword does just that- listen for a specific event. It requires 2 arguments: a string containing the title of the event that's emitted, and a function with which the data is passed through. In the case of our connection listener, use socket to define the data in the second argument. A socket is an individual client who is connected.

To listen for connections to your server, add the following within your database connection:

io.on('connection', socket => {
console.log('A user has connected');
});

Now for the client to connect, you just need to add the following to your client.js which is loaded by the page after you've authenticated:

/*global io*/
let socket = io();

The comment suppresses the error you would normally see since 'io' is not defined in the file. You have already added a reliable CDN to the Socket.IO library on the page in chat.pug.

Now try loading up your app and authenticate and you should see in your server console A user has connected.

Note:io() works only when connecting to a socket hosted on the same url/server. For connecting to an external socket hosted elsewhere, you would use io.connect('URL');.

Submit your page when you think you've got it right. If you're running into errors, you can check out the project completed up to this point.

--hints--

socket.io should be a dependency.

async (getUserInput) => {
const url = new URL("/_api/package.json", getUserInput("url"));
const res = await fetch(url);
const packJson = await res.json();
assert.property(
packJson.dependencies,
'socket.io',
'Your project should list "socket.io" as a dependency'
);
}

You should correctly require and instantiate http as http.

async (getUserInput) => {
const url = new URL("/_api/server.js", getUserInput("url"));
const res = await fetch(url);
const data = await res.text();
assert.match(
data,
/http.*=.*require.*('|")http\1/s,
'Your project should list "http" as a dependency'
);
}

You should correctly require and instantiate socket.io as io.

async (getUserInput) => {
const url = new URL("/_api/server.js", getUserInput("url"));
const res = await fetch(url);
const data = await res.text();
assert.match(
data,
/io.*=.*require.*('|")socket.io\1.*http/s,
'You should correctly require and instantiate socket.io as io.'
);
}

Socket.IO should be listening for connections.

async (getUserInput) => {
const url = new URL("/_api/server.js", getUserInput("url"));
const res = await fetch(url);
const data = await res.text();
assert.match(
data,
/io.on.*('|")connection\1.*socket/s,
'io should listen for "connection" and socket should be the 2nd arguments variable'
);
}

Your client should connect to your server.

async (getUserInput) => {
const url = new URL("/public/client.js", getUserInput("url"));
const res = await fetch(url);
const data = await res.text();
assert.match(
data,
/socket.*=.*io/s,
'Your client should be connection to server with the connection defined as socket'
);
}