Inilah upaya saya agar yang berikut ini berfungsi:
- ekspres : 4.14
- socket.io : 1.5
- paspor (menggunakan sesi): 0.3
- redis : 2.6 (Struktur data yang sangat cepat untuk menangani sesi; tetapi Anda juga dapat menggunakan yang lain seperti MongoDB. Namun, saya mendorong Anda untuk menggunakan ini untuk data sesi + MongoDB untuk menyimpan data persisten lainnya seperti Pengguna)
Karena Anda mungkin ingin menambahkan beberapa permintaan API juga, kami juga akan menggunakan paket http agar HTTP dan soket Web bekerja di port yang sama.
server.js
Ekstrak berikut hanya mencakup semua yang Anda butuhkan untuk mengatur teknologi sebelumnya. Anda dapat melihat versi server.js lengkap yang saya gunakan di salah satu proyek saya di sini .
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}`);
sockets / index.js
Kami socketConnectionHandler
, saya hanya tidak suka meletakkan semuanya di dalam server.js (meskipun Anda bisa), terutama karena file ini dapat berisi cukup banyak kode dengan cukup cepat.
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}`);
}
});
}
Materi tambahan (klien):
Hanya versi yang sangat dasar dari apa yang bisa menjadi klien 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}`);
});
Referensi:
Saya hanya tidak bisa merujuk ke dalam kode, jadi saya memindahkannya ke sini.
1: Cara mengatur strategi Paspor Anda: https://scotch.io/tutorials/easy-node-authentication-setup-and-local#handling-signupregistration