应用结构

注册事件处理程序

您将在下面找到关于如何注册事件处理程序的两个建议。

请注意,这些只是建议,而不是您必须遵循的严格准则。请根据自己的喜好进行调整!

每个文件注册自己的事件处理程序

在这里,入口点保持整洁,但事件侦听器可能不太容易被发现(尽管强命名约定/ctrl+f 会有所帮助)。

index.js

  1. const httpServer = require("http").createServer();
  2. const io = require("socket.io")(httpServer);
  3. const registerOrderHandlers = require("./orderHandler");
  4. const registerUserHandlers = require("./userHandler");
  5. const onConnection = (socket) => {
  6. registerOrderHandlers(io, socket);
  7. registerUserHandlers(io, socket);
  8. }
  9. io.on("connection", onConnection);

orderHandler.js

  1. module.exports = (io, socket) => {
  2. const createOrder = (payload) => {
  3. // ...
  4. }
  5. const readOrder = (orderId, callback) => {
  6. // ...
  7. }
  8. socket.on("order:create", createOrder);
  9. socket.on("order:read", readOrder);
  10. }

所有事件处理程序都注册在 index.js 文件中

在这里,每个事件名称都位于同一个位置,这对可发现性非常有用,但在中/大型应用程序中可能会失控。

index.js

  1. const httpServer = require("http").createServer();
  2. const io = require("socket.io")(httpServer);
  3. const { createOrder, readOrder } = require("./orderHandler")(io);
  4. const { updatePassword } = require("./userHandler")(io);
  5. const onConnection = (socket) => {
  6. socket.on("order:create", createOrder);
  7. socket.on("order:read", readOrder);
  8. socket.on("user:update-password", updatePassword);
  9. }
  10. io.on("connection", onConnection);

orderHandler.js

  1. module.exports = (io) => {
  2. const createOrder = function (payload) {
  3. const socket = this; // hence the 'function' above, as an arrow function will not work
  4. // ...
  5. };
  6. const readOrder = function (orderId, callback) {
  7. // ...
  8. };
  9. return {
  10. createOrder,
  11. readOrder
  12. }
  13. }