Đây là nỗ lực của tôi để làm việc sau:
- thể hiện : 4,14
- socket.io : 1.5
- hộ chiếu (sử dụng phiên): 0,3
- redis : 2.6 (Cấu trúc dữ liệu thực sự nhanh để xử lý các phiên; nhưng bạn cũng có thể sử dụng các phiên khác như MongoDB. Tuy nhiên, tôi khuyến khích bạn sử dụng cấu trúc này cho dữ liệu phiên + MongoDB để lưu trữ dữ liệu liên tục khác như Người dùng)
Vì bạn có thể muốn thêm một số yêu cầu API, chúng tôi cũng sẽ sử dụng gói http để có cả HTTP và ổ cắm Web hoạt động trong cùng một cổng.
server.js
Phần trích xuất sau chỉ bao gồm mọi thứ bạn cần để thiết lập các công nghệ trước đó. Bạn có thể xem phiên bản server.js hoàn chỉnh mà tôi đã sử dụng trong một trong những dự án của mình tại đây .
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
Của chúng tôi socketConnectionHandler
, tôi chỉ không thích đặt mọi thứ bên trong server.js (mặc dù bạn hoàn toàn có thể làm được), đặc biệt là vì tệp này có thể chứa khá nhiều mã khá nhanh.
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}`);
}
});
}
Vật liệu phụ (khách hàng):
Chỉ là một phiên bản rất cơ bản của ứng dụng JavaScript socket.io có thể là:
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}`);
});
Người giới thiệu:
Tôi chỉ không thể tham chiếu bên trong mã, vì vậy tôi đã chuyển nó vào đây.
1: Cách thiết lập chiến lược Hộ chiếu của bạn: https://scotch.io/tutorials/easy-node-authentication-setup-and-local#handling-signupregistration