Ecco il mio tentativo di far funzionare quanto segue:
- espresso : 4.14
- socket.io : 1.5
- passaporto (utilizzando sessioni): 0.3
- redis : 2.6 (Struttura dei dati molto veloce per gestire le sessioni; ma puoi anche usarne altri come MongoDB. Tuttavia, ti incoraggio a usarlo per i dati di sessione + MongoDB per memorizzare altri dati persistenti come Utenti)
Dal momento che potresti voler aggiungere anche alcune richieste API, useremo anche il pacchetto http per avere sia HTTP che Web socket funzionanti sulla stessa porta.
server.js
Il seguente estratto include solo tutto il necessario per impostare le tecnologie precedenti. Puoi vedere la versione completa di server.js che ho usato in uno dei miei progetti qui .
import http from 'http';
import express from 'express';
import passport from 'passport';
import { createClient as createRedisClient } from 'redis';
import connectRedis from 'connect-redis';
import Socketio from 'socket.io';
// Your own socket handler file, it's optional. Explained below.
import socketConnectionHandler from './sockets';
// Configuration about your Redis session data structure.
const redisClient = createRedisClient();
const RedisStore = connectRedis(Session);
const dbSession = new RedisStore({
client: redisClient,
host: 'localhost',
port: 27017,
prefix: 'stackoverflow_',
disableTTL: true
});
// Let's configure Express to use our Redis storage to handle
// sessions as well. You'll probably want Express to handle your
// sessions as well and share the same storage as your socket.io
// does (i.e. for handling AJAX logins).
const session = Session({
resave: true,
saveUninitialized: true,
key: 'SID', // this will be used for the session cookie identifier
secret: 'secret key',
store: dbSession
});
app.use(session);
// Let's initialize passport by using their middlewares, which do
//everything pretty much automatically. (you have to configure login
// / register strategies on your own though (see reference 1)
app.use(passport.initialize());
app.use(passport.session());
// Socket.IO
const io = Socketio(server);
io.use((socket, next) => {
session(socket.handshake, {}, next);
});
io.on('connection', socketConnectionHandler);
// socket.io is ready; remember that ^this^ variable is just the
// name that we gave to our own socket.io handler file (explained
// just after this).
// Start server. This will start both socket.io and our optional
// AJAX API in the given port.
const port = 3000; // Move this onto an environment variable,
// it'll look more professional.
server.listen(port);
console.info(`🌐 API listening on port ${port}`);
console.info(`🗲 Socket listening on port ${port}`);
prese / index.js
Il nostro socketConnectionHandler
, semplicemente non mi piace mettere tutto all'interno di server.js (anche se potresti perfettamente), soprattutto perché questo file può finire per contenere un bel po 'di codice abbastanza rapidamente.
export default function connectionHandler(socket) {
const userId = socket.handshake.session.passport &&
socket.handshake.session.passport.user;
// If the user is not logged in, you might find ^this^
// socket.handshake.session.passport variable undefined.
// Give the user a warm welcome.
console.info(`⚡︎ New connection: ${userId}`);
socket.emit('Grettings', `Grettings ${userId}`);
// Handle disconnection.
socket.on('disconnect', () => {
if (process.env.NODE_ENV !== 'production') {
console.info(`⚡︎ Disconnection: ${userId}`);
}
});
}
Materiale extra (cliente):
Solo una versione molto semplice di ciò che potrebbe essere il client JavaScript socket.io:
import io from 'socket.io-client';
const socketPath = '/socket.io'; // <- Default path.
// But you could configure your server
// to something like /api/socket.io
const socket = io.connect('localhost:3000', { path: socketPath });
socket.on('connect', () => {
console.info('Connected');
socket.on('Grettings', (data) => {
console.info(`Server gretting: ${data}`);
});
});
socket.on('connect_error', (error) => {
console.error(`Connection error: ${error}`);
});
Riferimenti:
Non potevo fare riferimento all'interno del codice, quindi l'ho spostato qui.
1: Come impostare le strategie per Passport: https://scotch.io/tutorials/easy-node-authentication-setup-and-local#handling-signupregistration