【问题标题】:How to use app.listen with Socket.io in Node?如何在 Node 中使用 app.listen 和 Socket.io?
【发布时间】:2019-03-10 09:28:10
【问题描述】:

这是我的 index.js 文件的 node.js 代码。

const express = require('express');
const bodyParser = require('body-parser');
const cors = require('cors');

const { mongoose } = require('./config/db.js');
var routes = require('./routes/routes');
var j = require('./utility/mailer');
var app = express();



//app.use(bodyParser.json());
app.use(bodyParser.json({ limit: '50mb' }));
app.use(bodyParser.urlencoded({ extended: true, limit: '50mb' }));

app.use(cors({ origin: 'http://localhost:4200' }));
app.use(express.static('uploads'));
//app.listen(3000, () => console.log('server started'));
app.use(function (req, res, next) {
    res.setTimeout(10000, function () {
        console.log('timeout call');
        res.status(408).send({ 'res': 'timed out' });
        //res.end(408);
        return;
    });
    next();
});
app.use('/', routes);

app.set("port", (process.env.PORT || 3000));
//app.listen(app.get("port"), function () {
// console.log("Server started: http://localhost:" + app.get("port") + "/");
//})
//var server = app.listen(app.get('port'), function () {
//   console.log('Express server listening on port ' + server.address().port);
//});

var server = app.listen(3000);

var io = require("socket.io").listen(server, {
    handlePreflightRequest: (req, res) => {
        const headers = {
            "Access-Control-Allow-Headers": "Content-Type, Authorization",
            "Access-Control-Allow-Origin": req.headers.origin,
            "Access-Control-Allow-Credentials": true
        };
        res.writeHead(200, headers);
        res.end();
    }
});

let timerId = null,
    sockets = new Set();
io.sockets.on('connection', socket => {

    sockets.add(socket);
    console.log(`Socket ${socket.id} added`);

    if (!timerId) {
        startTimer();
    }

    socket.on('clientdata', data => {
        console.log(data);
    });

    socket.on('disconnect', () => {
        console.log(`Deleting socket: ${socket.id}`);
        sockets.delete(socket);
        console.log(`Remaining sockets: ${sockets.size}`);
    });

});
function startTimer() {
    //Simulate stock data received by the server that needs 
    //to be pushed to clients
    timerId = setInterval(() => {
        if (!sockets.size) {
            clearInterval(timerId);
            timerId = null;
            console.log(`Timer stopped`);
        }
        let value = ((Math.random() * 50) + 1).toFixed(2);
        //See comment above about using a "room" to emit to an entire
        //group of sockets if appropriate for your scenario
        //This example tracks each socket and emits to each one
        for (const s of sockets) {
            console.log(`Emitting value: ${value}`);
            s.emit('data', { data: value });
        }

    }, 2000);
}
var gulp = require('gulp');
var sonarqubeScanner = require('sonarqube-scanner');

gulp.task('default', function (callback) {
    sonarqubeScanner({
        serverUrl: "https://localhost:8081",
    }, callback);
});
io.listen(8000);
//server.listen(8080);

但是,服务器并未按照定时器函数中的指定发送数据。你能帮我解决这个问题吗?有没有办法使用 app.listen 呢?

学习了一些教程。几天前它工作正常。然后,我改变了一些让事情变得混乱的东西。我想我必须弄清楚我改变了什么。有什么解决办法吗?

【问题讨论】:

    标签: node.js express socket.io


    【解决方案1】:

    如果你想在与 webserver 相同的端口上运行 socket.io,你可以试试这个:

    const app = express();
    const server = require('http').createServer(app);
    const io = require('socket.io')(server);
    
    io.on('connection', (socket) => {
        //your code here
    });
    
    http.listen((process.env.PORT || 3000), () => {
        console.log('Started');
    });
    

    【讨论】:

      【解决方案2】:

      我声明变量端口将是您将托管服务器的端口,例如const port = 3000;(端口号可以是您喜欢的任何内容)。然后添加让服务器监听的代码:

      server.listen(port, () => {
          // What will happen when the server starts listening
      });
      

      虽然,你需要声明服务器变量server.listen(),如果你在做一个简单的http服务器,你可以这样说:

      const server = http.createServer((req, res) => {
          // What the server would do
      });
      

      另外,您需要声明 const server = http.createServer() 中的 http 是什么。您需要做的是添加一段代码,说明 http 是什么,例如 const http = require('http');。这将使一个简单的 http 服务器监听 http://localhost:your port/。完成的产品应如下所示:

      const http = require('http');
      
      const port = 3000;
      
      const server = http.createServer((req, res) => {
          // Your Code Here
      });
      
      server.listen(port, () => {
          // Your Code Here
      });
      

      然后,在您的终端中输入node index.js,它应该会启动您的服务器,并且能够在您的浏览器上看到它!!

      注意:此代码对于您正在执行的操作可能过于简单,但可能会起作用

      【讨论】:

      • OP 想用express 植入socket.io。在您的回答中,您没有使用这些软件包。
      猜你喜欢
      • 1970-01-01
      • 2016-10-28
      • 1970-01-01
      • 2015-02-11
      • 2019-05-24
      • 2013-04-25
      • 1970-01-01
      • 1970-01-01
      • 2016-08-17
      相关资源
      最近更新 更多