นี่คือความพยายามของฉันที่จะทำงานต่อไปนี้:
- ด่วน : 4.14
- socket.io : 1.5
- หนังสือเดินทาง (ใช้เซสชัน): 0.3
- redis : 2.6 (โครงสร้างข้อมูลที่รวดเร็วมากในการจัดการเซสชัน แต่คุณสามารถใช้อื่น ๆ เช่น MongoDB ได้เช่นกันอย่างไรก็ตามฉันขอแนะนำให้คุณใช้สิ่งนี้สำหรับข้อมูลเซสชัน + MongoDB เพื่อจัดเก็บข้อมูลถาวรอื่น ๆ เช่นผู้ใช้)
เนื่องจากคุณอาจต้องการเพิ่มคำขอ API ด้วยเราจึงใช้แพ็กเกจhttpเพื่อให้ทั้ง HTTP และซ็อกเก็ตเว็บทำงานในพอร์ตเดียวกัน
server.js
สารสกัดต่อไปนี้รวมเฉพาะทุกสิ่งที่คุณต้องการเพื่อตั้งค่าเทคโนโลยีก่อนหน้านี้ ท่านสามารถเข้าดูรุ่น server.js สมบูรณ์ซึ่งผมใช้ในหนึ่งในโครงการของฉันที่นี่
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}`);
ซ็อกเก็ต / index.js
ของเราsocketConnectionHandler
ฉันไม่ชอบวางทุกอย่างไว้ใน server.js (แม้ว่าคุณจะทำได้อย่างสมบูรณ์แบบก็ตาม) โดยเฉพาะอย่างยิ่งเนื่องจากไฟล์นี้อาจมีโค้ดจำนวนมากค่อนข้างเร็ว
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}`);
}
});
}
วัสดุพิเศษ (ลูกค้า):
เป็นเพียงเวอร์ชันพื้นฐานของสิ่งที่ไคลเอ็นต์ 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}`);
});
อ้างอิง:
ฉันไม่สามารถอ้างอิงภายในรหัสได้ดังนั้นฉันจึงย้ายมาที่นี่
1: วิธีตั้งค่ากลยุทธ์ Passport ของคุณ: https://scotch.io/tutorials/easy-node-authentication-setup-and-local#handling-signupregistration