【问题标题】:Socket.io with Express.js routes带有 Express.js 路由的 Socket.io
【发布时间】:2017-12-18 22:29:03
【问题描述】:

我将 socketio 与 expressjs 一起使用,并将其路由作为中间件。下面是我的代码。目前,我的设置不适用于我目前的方法。下面是我正在使用的代码 sn-ps,但没有一个是有效的。怎样才能做到这一点?

这里的nodejs代码是index.js

let app = require('express')();
let http = require('http').Server(app);
let io = require('socket.io')(http);

let newRoute = require('./routes/new');

io.on('connection', (socket) => {

    console.log('Listening to Socket');

    socket.on('FirstEvent', msg => {
        console.log(msg); // This works fine, no issues here and question is not for this.
    });
});

app.use((req, res, next) => {
    req.io = io;
    next();
});

app.use('/new', newRoute);

var port = process.env.PORT || 3001;

http.listen(port, function() {
console.log('listening in http://localhost:' + port);
});

这里是新的.js

let express = require('express');
let route = express.Router();

route.get('/', (request, response) => {
    console.log('NEW ROUTE'); // this is logs out.
    request.io.on('RouteEvent', msg => {
        console.log(msg); // this does not pop out
    });

    response.json({
        'RES': 'No Socket IO data'
    });
});

module.exports = route;

这是我的 home.ts 文件,在前端使用 ionic 3 包含以下代码

import { Component } from '@angular/core';
import { NavController } from 'ionic-angular';

import { RestServiceProvider } from '../../providers/rest-service/rest-service';

import { Socket } from 'ng-socket-io';

@Component({
    selector: 'page-home',
    templateUrl: 'home.html'
})
export class HomePage {

    nickname = '';

    constructor(public navCtrl: NavController, private socket: Socket, private rest: RestServiceProvider) { }

    joinChat() {
        this.socket.connect();
        this.socket.emit('FirstEvent', {
            'FirstEvent': 'AN EVENT TRAGETTED TO index.js ON SERVER SIDE'
        });

        this.rest.get().subscribe(response => {
            console.log('A LOG AFTER CALLING REST GET FUNCTION'); // 

            console.log('RESPONSE FROM THE SERVER: ', response);

            this.socket.emit('RouteEvent', {
                'RouteEvent': 'AN EVENT SENT TO THE ROUTE ON SERVER SIDE'
            });
        });
    }

}

这是我的休息服务

import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';

/*
Generated class for the RestServiceProvider provider.

See https://angular.io/guide/dependency-injection for more info on providers
and Angular DI.
*/
@Injectable()
export class RestServiceProvider {

    constructor(public http: HttpClient) {
        console.log('Hello RestServiceProvider Provider');
    }

    get() {
        console.log('GETTTTTT');
        return this.http.get('http://localhost:3001/new');
    }

}

我在这里犯的错误在哪里?


这是一个更新

我还在等待解决方案。

我也尝试了以下方法。我将路由包装到一个函数中,并在 index.js 文件中要求时将 io 作为参数传递。

这是我的 new.js 文件

let express = require('express');
let route = express.Router();

module.exports = (io) => {
    console.log(io);
    route.get('/', (request, response) => {
        console.log(io);

        io.on('RouteEvent', msg => {
            console.log(msg);
        });

        response.json({
            'RES': 'No Socket IO data'
        });
    });
}

这是我的 index.js 文件

let express = require('express');
let app = express();

let server = app.listen(3001);
let io = require('socket.io')(server);
let cors = require('cors');

app.use(cors());

let newRoute = require('./routes/new')(io); // this returns 404 not found

console.log('Server listening at port 3000');

上面的方法返回我从客户端发出请求时找不到的路由404(与上面相同)。然后我将 app.use() 添加到下面的 newRoute 中。

let newRoute = require('./routes/new')(io);
app.use('/new', newRoute);

然后它开始返回以下错误。

TypeError: Router.use() requires a middleware function but got a undefined

知道我哪里做错了吗?

【问题讨论】:

  • 当您说“这些都不起作用”时,您能说得更具体一点吗?它似乎在哪里坏了?
  • 它没有中断,但我在上述路由的服务器端根本没有收到任何事件。
  • 谁能帮忙?我还在等待这个的解决方案。
  • new.js 中,尝试将您的事件包装在request.io.on('connection', (socket) => { 中——socket.io 中的所有内容都需要包装在连接处理程序中。
  • 那也没用。在 indexjs 中,我确实收到了来自客户端的事件,但不在路由文件中。

标签: javascript node.js angular express socket.io


【解决方案1】:

您在更新的解决方案中遇到的 TypeError 是因为在 new.js 中,您要导出的函数返回未定义(因为没有 return 语句)。如果您返回路线,您的代码应该可以工作:

const express = require('express');
const route = express.Router();

module.exports = (io) => {
    console.log(io);
    route.get('/', (request, response) => {
        console.log(io);

        io.on('RouteEvent', msg => {
            console.log(msg);
        });

        response.json({
            'RES': 'No Socket IO data'
        });
    });

    return route; // add this return statement
}

【讨论】:

    猜你喜欢
    • 2012-09-16
    • 2013-05-25
    • 1970-01-01
    • 1970-01-01
    • 2017-09-02
    • 1970-01-01
    • 1970-01-01
    • 2015-06-02
    • 2015-03-16
    相关资源
    最近更新 更多