我有一个带有 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/