如何从另一个 js 文件/函数中触发 mongoose post hook?

Posted

技术标签:

【中文标题】如何从另一个 js 文件/函数中触发 mongoose post hook?【英文标题】:How to get mongoose post hook fired from another js file/function? 【发布时间】:2019-08-05 01:37:30 【问题描述】:

我有这个 location.model.js,

'use strict';

var mongoose = require('mongoose'),
Schema = mongoose.Schema;

var LocationsSchema = new Schema(
 name: String,
 description: String,
 country_id:
    type: Schema.Types.ObjectId,
    ref: 'Countries'
 ,
 geo_location:
    type: [Number] 
 ,
 icon: String,
 image: String,
 status: 
    type: Boolean,
    default: true
 ,
 created_at : 
    type: Date,
    default: new Date()
 ,
 updated_at: 
    type: Date
 
);
LocationsSchema.index( geo_location: "2dsphere" );
module.exports = mongoose.model('Locations', LocationsSchema);

我会从控制器文件中进行查找、保存、更新等查询。 我有一个这样的 location.socket 文件。

'use strict';
var locations = require('./locations.model');

exports.register = function(socket) 
  //socket.emit('locations:save', 'Helloooo');
  locations.schema.post('save', function (doc) 
    console.log('new location added');
  );

如果我将该钩子放在模型本身中,猫鼬后保存钩子工作正常。但是当我放入 location.socket.js 文件时,没有触发相同的钩子。 所以我需要做的就是从这个 location.socket.js 文件中做 socket.emit

编辑: 这是 app.js(服务器启动文件)

    var server = require('http').createServer(app);
    var socketio = require('socket.io')(server, 
      serveClient: config.env !== 'production',
      path: '/socket.io'
    );
    require('./config/socketio')(socketio);
    require('./config/express')(app);
    require('./routes')(app);

    server.listen(config.port, config.ip, function () 
          console.log('server started');
    );

这里是socketio配置文件,

module.exports = function (socketio) 
  socketio.on('connection', function (socket) 
    require('../api/locations/locations.socket').register(socket);
  )

【问题讨论】:

我认为你必须在初始化你的猫鼬模型之前定义所有的猫鼬钩子。但这里不是这样。 我提到的所有文章都在说在猫鼬模型之前定义所有猫鼬钩子的同一点。这也是我在这里所做的,但没有得到解决方案。 你在哪里调用这个注册函数? 服务器启动时,我将连接的客户端套接字发送到此注册函数。 请显示您调用此函数的代码 【参考方案1】:

请试试这个:-

module.exports = function (socketio) 
  require('../api/locations/locations.socket').register(socketio)


exports.register = function(socketio) 
  socketio.emit('locations:save', 'Helloooo');

但这会发送到每个连接的套接字。所以如果你需要发射到一个特定的套接字,你需要在 socketio 中使用房间。

【讨论】:

其实问题是mongoose post save hook没有被另一个js文件触发 是的,我知道。你试过这个解决方案了吗? 是的..这像往常一样工作。 socketio 发射很好。

以上是关于如何从另一个 js 文件/函数中触发 mongoose post hook?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Reactjs 中从另一个组件触发状态

如何快速从另一个控制器调用函数

从另一个javascript文件调用javascript函数

如何获取 server.js 文件以从另一个文件(如 config.js)中提取密码?

如何从另一个 .js 文件调用 .js? [复制]

如何从另一个类触发 UIButton?