node.js - 使用 Socket.IO 的 letsencrypt-express

标签 node.js express socket.io lets-encrypt

我不明白,我该如何配置 LEX使用 socket.io。这是我现在拥有的:

服务器.js

var express    = require('express');
var app = express();
var bodyParser = require('body-parser');

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

var port = 80;
if(process.argv[2] == 'dev') port = 3001;

var router = express.Router();

app.use(function (req, res, next) {
    res.setHeader('Access-Control-Allow-Origin', '*');
    res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
    res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type, userId');
    next();
});

var api = require('./api');
api(app, port)

app.use(express.static(__dirname + "/../dist"));
app.get('/', function(req, res) {
  res.render('index.html');
});
console.log('Magic happens on port ' + port);

API.js

var API = function(app, port){
  var pg = require('pg');
  var lex = require('letsencrypt-express').testing();

  var connectedUsers = {};

  var config ={
    user: "postgres",
    password: "password",
    database: "production",
    port: 5432,
    host: "serverIpAddress",
    ssl: false
  }; 

  pg.connect(config, function(err, client, done) {

    if (err) {
      return console.error('error fetching client from pool', err);
    }
    // var server = require('http').Server(app);
    var server = lex.create({
      configDir: './letsencrypt.config',
      onRequest: app,
      letsencrypt: null,
    });


    var io = require('socket.io')(server);

    server.listen(port);

    io.on('connection', function (socket) {
      console.log('new connection')

    });
  });

}

module.exports = API

看看 api.js 中的注释行:当我使用它而不是时一切正常:

var server = lex.create({
      configDir: './letsencrypt.config',
      onRequest: app,
      letsencrypt: null,
    });

使用 LEX,我在尝试运行服务器时收到此错误:

[LEX] testing mode turned on
[LEX] default server: https://acme-staging.api.letsencrypt.org/directory


###################################################
#                                                 #
#     Open up a browser and visit this server     #
#     at its domain name.                         #
#                                                 #
#                                 ENJOY!          #
#                                                 #
###################################################


Note: testing certs will be installed because .testing() was called.
      remove .testing() to get live certs.


[LEX] automatic registration handling turned on for testing.


Magic happens on port 3001
[LEX] creating sniCallback {
  "configDir": "./letsencrypt.config",
  "onRequest": {
    "domain": null,
    "_events": {},
    "_eventsCount": 3,
    "_connections": 0,
    "_handle": null,
    "_usingSlaves": false,
    "_slaves": [],
    "_unref": false,
    "allowHalfOpen": true,
    "pauseOnConnect": false,
    "httpAllowHalfOpen": false,
    "timeout": 120000
  },
  "letsencrypt": {
    "backend": {}
  },
  "debug": true,
  "webrootPath": "/var/folders/2m/vfw1bgqd4pv7hk86kcbvcrlc0000gn/T/acme-challenge",
  "privkeyPath": "./letsencrypt.config/live/:hostname/privkey.pem",
  "fullchainPath": "./letsencrypt.config/live/:hostname/fullchain.pem",
  "certPath": "./letsencrypt.config/live/:hostname/cert.pem",
  "chainPath": "./letsencrypt.config/live/:hostname/chain.pem",
  "server": "https://acme-staging.api.letsencrypt.org/directory"
}
projectRootFolder/node_modules/socket.io/node_modules/engine.io/lib/server.js:358
  var listeners = server.listeners('request').slice(0);
                         ^

TypeError: server.listeners is not a function
    at Server.attach (projectRootFolder/node_modules/socket.io/node_modules/engine.io/lib/server.js:358:26)
    at Function.attach (projectRootFolder/node_modules/socket.io/node_modules/engine.io/lib/engine.io.js:124:10)
    at Server.listen.Server.attach (projectRootFolder/node_modules/socket.io/lib/index.js:226:21)
    at new Server (projectRootFolder/node_modules/socket.io/lib/index.js:51:17)
    at Server (projectRootFolder/node_modules/socket.io/lib/index.js:39:41)
    at projectRootFolder/server/api.js:73:34
    at projectRootFolder/node_modules/pg/lib/pool.js:82:9
    at projectRootFolder/node_modules/pg/node_modules/generic-pool/lib/generic-pool.js:281:11
    at projectRootFolder/node_modules/pg/lib/pool.js:56:18
    at null.<anonymous> (projectRootFolder/node_modules/pg/lib/client.js:149:7)
    at g (events.js:260:16)
    at emitOne (events.js:82:20)
    at emit (events.js:169:7)
    at Socket.<anonymous> (projectRootFolder/node_modules/pg/lib/connection.js:109:12)
    at emitOne (events.js:77:13)
    at Socket.emit (events.js:169:7)

我想,我的代码中有一个非常简单的错误,因为我之前没有使用 SSL 配置 Socket.io。

谢谢

最佳答案

试试这段代码。它只适用于最新版本的 letsencrypt-express。

应用程序.js

var express = require('express');
var app = express();
var socketIO = require('socket.io');
var LEX = require('letsencrypt-express').testing();
var https = require('http2');

app.get('/', function (req, res) {
  res.sendFile(__dirname + '/index.html');
});

var lex = LEX.create({
  configDir: '/etc/letsencrypt'
, letsencrypt: null
, approveRegistration: function (hostname, cb) {
    cb(null, {
      domains: ['example.com']
    , email: 'info@example.com'
    , agreeTos: true
    });
  }
});

var server = https.createServer(lex.httpsOptions, LEX.createAcmeResponder(lex, app));
server.listen(443);

var io = socketIO.listen(server);
io.on('connection', function (socket) {
  socket.emit('news', { hello: 'world' });
  socket.on('my other event', function (data) {
    console.log(data);
  });
});

index.html

<script src="https://cdn.socket.io/socket.io-1.4.5.js"></script>
<script>
  var socket = io.connect('https://example.com');
  socket.on('news', function (data) {
    console.log(data);
    socket.emit('my other event', { my: 'data' });
  });
</script>

关于node.js - 使用 Socket.IO 的 letsencrypt-express,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35332191/

相关文章:

javascript - 如何使用 Express js 保护简单的 GET 请求

javascript - 在 react/redux 应用程序(代理)中隐藏 api url

javascript - 带有 Nginx + NodeJS 跨源请求的 Socket.io 只能部分工作

node.js - 带有 Websocket 的 Nodejs REST API

node.js - 设置浏览器cookie

javascript - Socket.io-知道哪个房间的 socket 在哪

node.js - 如何使用Node.js将数据推送到ElasticSearch中的指定索引

mysql - Nodejs Sequelize 和passport Js,在注册用户时卡在执行查询上

node.js - AWS Cognito adminCreateUser 可以发送临时密码吗?

javascript - Node Express.js 从单独文件中声明的路由访问变量