node.js - 当有人调用 API 时,socket.io 会发出信号

标签 node.js socket.io

我有一个带有 NodeJS Express 服务器和 Angular2 前端的小项目。服务器有API接口(interface)。主要部分是:/api/alert。我想要执行以下操作:如果 /api/alert 收到请求,则 socket.io 向所有连接的客户端广播一个事件。

我的服务器结构如下:

server.js

var http        = require('http'),
    express     = require('express'),
    app         = module.exports.app = express(),
    port        = process.env.PORT || 3000,
    mongoose    = require('mongoose'),
    bodyParser  = require('body-parser'),
    db          = require('./config/db'),
    path        = require('path');

mongoose.Promise = global.Promise;
mongoose.connect(db.url);

app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

app.use(express.static(path.join(__dirname, 'dist')));

var routes = require('./server/routes/index');
routes(app);

var server = http.createServer(app);
var io = require('socket.io')(server);
server.listen(port);

console.log('Server started on: ' + port);

服务器/路由/index.js

const deviceRoute   = require('./devicesRoute');
const alertRoute    = require('./alertsRoute');

module.exports = function(app) {
    deviceRoute(app);
    alertRoute(app);
}

server/routes/alertRoute.js

'use strict';
module.exports = function(app) {

    var alertsService = require('../services/alertsService');

    app.route('/api/alert')
        .post(alertsService.createAlert);
};

server/service/alertService.js

'use strict';

exports.createAlert = function(req, res) {
    // do something in database

    // I want to broadcast to all client HERE
};

我无法将 io 和服务器变量传递给函数(来自 server.js)。我怎样才能做到这一点?最简单的方法是什么?

谢谢!

最佳答案

首先,您需要从 server.js 导出应用程序和服务器对象,并将套接字传递到中间件中的响应,如下所示:

var app = express();
var server = http.createServer(app);
var io = require('socket.io')(server);

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

...

module.exports = {app: app, server: server};

然后,您可以将在 server.js 中创建的服务器实例(取决于您从何处需要它)作为

var server = require('../server').server;

由于您将socket.io添加到响应对象中,您可以在您的服务中将其用作

'use strict';

exports.createAlert = function(req, res) {
    // do something in database

    // I want to broadcast to all client HERE
    res.io.emit("broadcast", "clients");

};

关于node.js - 当有人调用 API 时,socket.io 会发出信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48672924/

相关文章:

node.js - 在 socket.io 中使用 RedisStore 的示例

javascript - JS Socket.io 断开 for() 循环

node.js - Express 路由器创建不需要的新 session

javascript - 模块未定义

node.js - 如何使用带选项的 Node.js zlib 模块?

javascript - 如何在 socket.io 中锁定全局数组

javascript - 在 NodeJS 中将 K,V 对分配给 JSON 对象

Node.js(Express) REST 服务 POST 方法返回 404

javascript - Socket.io 响应 : How to get server to respond to multiple clients upon receiving info from all clients?

javascript - Socket.io 仅向当前用户发送