node.js - 如何在 Node 中触发 Mongoose 保存的套接字事件?

标签 node.js mongoose socket.io

这是我的模型。

const mongoose = require('mongoose');
var timestamps = require('mongoose-timestamp');

var CategorySchema = new mongoose.Schema({
    name: String
});

CategorySchema.plugin(timestamps);
CategorySchema.post('save', function () {
    console.log(this.name);
  });
var Category = mongoose.model('Category', CategorySchema);

module.exports = Category;

这是我的index.js

const express = require('express');
const bodyParser = require('body-parser');
const cors = require('cors');

const { mongoose } = require('./config/db.js');
var routes = require('./routes/routes');
var j = require('./utility/mailer');
var app = express();

//app.use(bodyParser.json());
app.use(bodyParser.json({ limit: '50mb' }));
app.use(bodyParser.urlencoded({ extended: true, limit: '50mb' }));

app.use(cors({ origin: 'http://localhost:4200' }));
app.use(express.static('uploads'));
//app.listen(3000, () => console.log('server started'));
app.use(function (req, res, next) {
    res.setTimeout(10000, function () {
        console.log('timeout call');
        res.status(408).send({ 'res': 'timed out' });
        //res.end(408);
        return;
    });
    next();
});
app.use('/', routes);

app.set("port", (process.env.PORT || 3000));
/*
app.listen(app.get("port"), function () {
 console.log("Server started: http://localhost:" + app.get("port") + "/");
}) */
var server = app.listen(app.get('port'), function () {
    console.log('Express server listening on port ' + server.address().port);
});


var io = require("socket.io").listen(server, {
    handlePreflightRequest: (req, res) => {
        const headers = {
            "Access-Control-Allow-Headers": "Content-Type, Authorization",
            "Access-Control-Allow-Origin": req.headers.origin,
            "Access-Control-Allow-Credentials": true
        };
        res.writeHead(200, headers);
        res.end();
    }
});

let timerId = null,
    sockets = new Set();
io.on('connection', socket => {
    console.log('connected');
    sockets.add(socket);
    console.log(`Socket ${socket.id} added`);

    if (!timerId) {
        startTimer();
    }

       socket.emit('new data', { data: 'new data'});
    socket.on('clientdata', data => {
    });



    socket.on('disconnect', () => {
    });

});
function startTimer() {
    timerId = setInterval(() => {
        if (!sockets.size) {
            clearInterval(timerId);
            timerId = null;;
        }
        for (const s of sockets) {
            s.emit('data', { data: 'some data' });
        }

    }, 2000);
}
var gulp = require('gulp');
var sonarqubeScanner = require('sonarqube-scanner');

gulp.task('default', function (callback) {
    sonarqubeScanner({
        serverUrl: "https://localhost:8081",
    }, callback);
});
io.listen(8000);

我想触发类别模型文件中 Mongoose 保存 Hook 内的套接字事件。你能建议一种方法吗?钩子(Hook)正在工作。但我无法找到一种可能从 socket.on 触发事件的方法,因为它位于 index.js 中。

如果你不把计时器放在那里也没关系。这只是为了在一段时间内发出事件,因为我正在遵循教程。

最佳答案

您可以将 IO 设置为全局变量,以便可以在应用程序的任何位置访问它。

global.io = require("socket.io").listen(server, {
handlePreflightRequest: (req, res) => {
    const headers = {
        "Access-Control-Allow-Headers": "Content-Type, Authorization",
        "Access-Control-Allow-Origin": req.headers.origin,
        "Access-Control-Allow-Credentials": true
    };
    res.writeHead(200, headers);
    res.end();
}});

然后在你的保存 Hook 中

io.emit("event-name",payload);

关于node.js - 如何在 Node 中触发 Mongoose 保存的套接字事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55218756/

相关文章:

node.js - 通过在 mongoose 中填充匹配结果来查找文档

javascript - 使用 javascript 获取两个日期之间的日期列表

node.js - 使用 docker 时,npm 库不工作

javascript - 分配键和变量,无需在 Schema 中分配

sockets - 如何模拟本地服务器上的网络崩溃?

node.js , socket.io - 互联网连接断开时断开事件延迟

python - 如何在使用 Flask/Socketio 中服务器接口(interface)的服务器端生成 'dummy clients'

node.js - 尝试react-paypal-express-checkout时npm安装错误

node.js - 能够为每个BrowserWindow对象创建一个新 session ?

node.js - 在passport.js中,中间件方法 "local-signup"具有唯一的 key 电子邮件和密码。可以改也可以不改