node.js - Socket.io 在部署后无法工作 - 抛出错误 - 405(不允许)

标签 node.js angular express amazon-ec2 socket.io

使用 Angular 和 Node.js 构建应用程序。集成使用 Socket.io 构建的聊天应用程序。 本地测试时工作正常。即使将 Node JS 后端部署到服务器计算机(AWS EC2 实例)之后,我们的本地 Angular 应用程序也可以访问后端服务器。 但是在 EC2 中部署 Angular 应用程序后,聊天模块无法工作并抛出错误“POST https://mysitedotcom/socket.io/?EIO=3&transport=polling&t=MzNa0m- 405(不允许)” 请在下面找到服务器端代码。

require('./global_constants');

const Knex = require('knex');
const morgan = require('morgan');
const express = require('express');
const bodyParser = require('body-parser');
const promiseRouter = require('express-promise-router');
const rs = require('rocket-store');
const knexConfig = require('./knexfile');
const registerApi = require('./api');
const adminName = require('./config/config').admin.name;
const dbObj = require('./controllers/dbConn');
const cleaner = require('./controllers/textCleaner');
const fs = require('fs');
const rimraf = require('rimraf');
const socketIO = require('socket.io');
const db = dbObj.db;

const {
  Model
} = require('objection');
const cors = require('cors');

const knex = Knex(knexConfig[process.env.NODE_ENV || 'production']);

Model.knex(knex);

const router = promiseRouter();

const app = express()
  .use(bodyParser.json())
  .use(morgan('dev'))
  .use(cors(
    {
      credentials: true,
      origin: ['http://localhost:4200', 'http://localhost:4201']
    }
  ))

app.use('/api/', router).set('json spaces', 2);

app.use((req, res, next) => {
  res.setHeader('Content-Type', 'application/json');
  res.setHeader("Access-Control-Allow-Origin", "*");
  res.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
  next();
})


registerApi(router);

app.use((err, req, res, next) => {
  if (err) {
    console.error(err);
    res.status(err.statusCode || err.status || 500).send(err || {});
  } else {
    next();
  }
});

const http = require('https').createServer(app);
const io = socketIO(http);
http.listen(3000, function () {
  console.log('listening on *:3000');
});

rs.options({
  data_storage_area: "./msg",
  data_format: rs._FORMAT_JSON,
});


io.on('connection', socket => {
  socket.on('new-user', async (room, userId) => {
    // some logic goes here
  })

  socket.on('new-message', async (room) => {
    // Some logic
  })

  socket.on('user-disconnect', async (room, userId) => {
    // Some logic
  })
})

请在下面找到客户端代码

import { Injectable } from '@angular/core';
import * as io from 'socket.io-client';
import { Observable } from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class ChatService {

  private socket;
  constructor() {
    this.socket = io();
  }

  public newUser(roomName, id) {
    this.socket.emit('new-user', id, roomName);
  }
  public userDisconnected(roomName,id){
    this.socket.emit('user-disconnect',roomName,id)
  }

  public sendMessage(roomName, message,fullname,) {
    this.socket.emit('new-message',roomName,message,fullname);
  }

  public getconnect = () =>{
    return Observable.create((observer) => {
      this.socket.on('user-connected', (message,prev,socketId,flag) => {
          observer.next({msg:message,all_prev_msg:prev,socketId:socketId});
      });
    });
  }
  public getDisconnected = () =>{
    return Observable.create((observer) => {
      this.socket.on('user-disconnected', (message) => {
          observer.next(message);
      });
    });
  }

  public getMessages = () => {
    return Observable.create((observer) => {
      this.socket.on('new-message', (room,message,userId) => {
          observer.next({text:message,sender:userId});
      });
    });
  }

}

如果有人还有其他问题,请告诉我。 非常感谢。

最佳答案

看起来你的 ec2 服务器中有 nginx,如果是的话,你需要有下面的配置

location /static {
    try_files $uri =404;
}

location /socket.io {
        proxy_pass http://node;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
        add_header  Front-End-Https   on;
}

error_page 405 @nodejs;

关于node.js - Socket.io 在部署后无法工作 - 抛出错误 - 405(不允许),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59534226/

相关文章:

javascript - 如何避免渲染中嵌套三元?

node.js - Nodejs 应用程序一键启动

angular - 退订一系列订阅

angular - 如何定义 Angular Material 2 中的高度?

node.js - NodeJs 中的中间件总是重定向到同一页面(我猜)

javascript - Mongoose 查询结果无法与数据对象一起导出

angular - 无法读取 null 的属性 'addControl'

node.js - 在不在 App.js 中的函数中访问 i18next Translation

mysql - 在 NodeJS 中的准备查询中设置多个字段

mysql - Mocha 测试与数据库的连接