我正在尝试使用express.js 4创建一个非常简单的节点API,但我需要一些“实时”事件,因此我添加了socket.io。我对它们都相当新手,所以我可能错过了一些基础知识,但我找不到好的文档/教程。
在使用express生成器创建的应用程序中,我有类似于这样的内容,基于我读到的简单示例和项目文档。这可以正常工作,并且从客户端应用程序中,我可以发送/接收Socket事件:
var express = require('express');
var path = require('path');
var logger = require('morgan');
var api = require('./routes/api');
var app = express();
var io = require('socket.io').listen(app.listen(3000));
app.use(logger('dev'));
app.use(express.static(path.join(__dirname, 'public')));
app.use('/api', api);
io.sockets.on('connection', function (socket) {
console.log('client connect');
socket.on('echo', function (data) {
io.sockets.emit('message', data);
});
});
// error handlers omitted
module.exports = app;
但我想使用来自我的API路由的sockets(在我上面“require”的./routes/api.js文件中)。例如,有人可能使用API来PUT / POST资源,我希望将其广播到连接的socket.io客户端。
我无法看出如何在express路由内部使用'io'变量或组织当前位于io.sockets.on('connection' ...
函数中的代码。这是./routes/api.js文件:
var express = require('express');
var router = express.Router();
var io = ???;
router.put('/foo', function(req, res) {
/*
do stuff to update the foo resource
...
*/
// now broadcast the updated foo..
io.sockets.emit('update', foo); // how?
});
module.exports = router;
// Make io accessible to our router
应该在app.use('/api', api);
之前定义。 - platlasimport { Server as socketsIOServer } from 'socket.io';
。要将套接字服务器连接到您的express服务器,请使用const io = new socketsIOServer(app.listen(...));
。其余部分完全相同。 - ffigari