Socket.io вызывает ошибку «Ошибка: невозможно установить заголовки после их отправки». - PullRequest
2 голосов
/ 08 апреля 2019

Я пытаюсь развернуть в ibm-cloud веб-приложение с узлами Angular 2, node.js, express и mongo.Мое приложение работает нормально, без добавления socket.io, требуется строка:

const io = require("socket.io")(server);

Однако каждый раз, когда я пытаюсь добавить socket.io и выполнять контейнер, консольные журналы (для каждого запроса):

Ошибка: невозможно установить заголовки после их отправки.в SendStream.headersAlreadySent (/app/node_modules/send/index.js:390:13) в SendStream.send (/app/node_modules/send/index.js:618:10) в onstat (/ app / node_modules / send /)index.js: 730: 10) в FSReqWrap.oncomplete (fs.js: 153: 5) Ошибка: невозможно установить заголовки после их отправки.в SendStream.headersAlreadySent (/app/node_modules/send/index.js:390:13) в SendStream.send (/app/node_modules/send/index.js:618:10) в onstat (/ app / node_modules / send /)index.js: 730: 10) в FSReqWrap.oncomplete (fs.js: 153: 5) Ошибка: невозможно установить заголовки после их отправки.в SendStream.headersAlreadySent (/app/node_modules/send/index.js:390:13) в SendStream.send (/app/node_modules/send/index.js:618:10) в onstat (/ app / node_modules / send /)index.js: 730: 10) в FSReqWrap.oncomplete (fs.js: 153: 5)

Это мой код // Раскомментируйте следующее, чтобы включить отслеживание zipkin, адаптированное к конфигурации вашей сети:// var appzip = require ('appmetrics-zipkin') ({// host: 'localhost', // port: 9411, // serviceName: 'frontend' //});

    require('appmetrics-dash').attach();
    require('appmetrics-prometheus').attach();
    const appName = require('./../package').name;
    const http = require('http');
    const express = require('express');
    const log4js = require('log4js');
    const localConfig = require('./config/local.json');
    const path = require('path');
    const logger = log4js.getLogger(appName);
    logger.level = process.env.LOG_LEVEL || 'info'
    const app = express();
    const server = http.createServer(app);
    const io = require("socket.io")(server);


    app.use(log4js.connectLogger(logger, { level: logger.level }));
    require('./routers/index')(app, server);

    // Add your code here
    const bodyParser = require('body-parser');
    var cors = require('cors');
    const jwt = require("jsonwebtoken");

    const { mongoose } = require("./database");

    app.use(cors());
    app.use(bodyParser.json());
    app.use(bodyParser.urlencoded({
      extended: true
    }));

    app.use("/auth", require("./routes/auth.routes"));
    app.use(
      "/usuarios",
      (req, res, next) => {
        const bearerHeader = req.headers["authorization"];
        if (typeof bearerHeader !== "undefined") {
          const bearer = bearerHeader.split(" ");
          const bearerToken = bearer[1];
          jwt.verify(bearerToken, "loremipsum", (err, authData) => {
            if (err) return res.sendStatus(403);
            authData.rol == "admin" ? next() : res.sendStatus(403);
            return;
          });
        } else {
          res.sendStatus(403);
        }
      },
      require("./routes/usuarios.routes")
    );

    app.use("/api", (req, res, next) => {
      const bearerHeader = req.headers["authorization"];
      console.log(bearerHeader);
      if (typeof bearerHeader !== "undefined") {
        const bearer = bearerHeader.split(" ");
        const bearerToken = bearer[1];
        jwt.verify(bearerToken, "loremipsum", (err, authData) => {
          if (err) return res.sendStatus(403);
          req.authData = authData;
          next();
        });
      } else {
        res.sendStatus(403);
      }
    });
    app.use("/api/turnos", require("./routes/turns.routes"));
    app.use("/api/estado", require("./routes/estados.routes"));
    app.use("/api/incidencias", require("./routes/incidencia.routes"));
    app.use("/movil/api", require("./routes/movil.data.routes"));
    app.use("/movil/estadisticas", require("./routes/cola.routes"));
    app.use('/*', (req,res,next) => {
      res.sendFile(path.join(__dirname, '../public', 'index.html'));
      return;
    } )
    //end my code

    const port = process.env.PORT || localConfig.port;
    server.listen(port,'0.0.0.0', function(){
      logger.info(`tfgbff listening on http://localhost:${port}/appmetrics-dash`);
      logger.info(`OpenAPI (Swagger) spec is available at http://localhost:${port}/swagger/api`);
      logger.info(`Swagger UI is available at http://localhost:${port}/explorer`);
    });

    const turno = require("./controllers/turnos.controller");
    const io = require('socket.io')(server);
    io.on("connection", socket => {
      console.log("conectao!");
      turno.nextSubject.subscribe(turnos => {
        turnos = turnos.filter(t => t.atendido == false);
        const infoTurno = turnos.map(t => {
          return {
            incidenciaId: t.incidenciaId,
            turno: t.turno,
            siendoAtendido: t.siendoAtendido
          };
        });
        console.log(infoTurno);
        io.emit("socket-turnos", infoTurno);
      });
      socket.on("disconnect", () => console.log("desconectao!"));
    });
    // app.use(function (req, res, next) {
    //   res.sendFile(path.join(__dirname, '../public', '404.html'));
    // });

    // app.use(function (err, req, res, next) {
    //  res.sendFile(path.join(__dirname, '../public', '500.html'));
    // });

    module.exports = server;

Большое спасибо!

...