我正在使用molerrjs 来处理后端的微服务,并使用其中一个前端应用程序来处理通过套接字进行的通信。为此,我正在使用moleculer.io
. 我遇到的问题是,即使我将套接字连接到ctx
钩子中,当我在控制器函数中onBeforeCall()
console.log 时,套接字也不存在。ctx
我的网关看起来像这样(注意套接字被添加到钩子中的ctx
对象中:onBeforeCall()
const SocketIOService = require("moleculer-io");
module.exports = {
name: 'oas',
mixins: [SocketIOService],
settings: {
port: 5000,
io: {
namespaces: {
'/': {
events: {
'call': {
aliases: {
'auth.register': 'oas.controllers.auth.register'
},
whitelist: [
'**',
],
onBeforeCall: async function(ctx, socket, action, params, callOptions) { // before hook
console.log('socket: ', socket); // This exists here
ctx.socket = socket; // Here I attach the socket to the ctx object
},
onAfterCall: async function(ctx, socket, res) { // after hook
// console.log('after hook', res)
// res: The response data.
}
}
}
}
}
},
events: {},
actions: {}
}
};
我的 auth.service 看起来像这样 - 注意register()
尝试访问的函数ctx.socket
:
"use strict";
/**
* @typedef {import('moleculer').Context} Context Moleculer's Context
*/
module.exports = {
name: "oas.controllers.auth",
/**
* Settings
*/
settings: {
},
/**
* Dependencies
*/
dependencies: [],
/**
* Actions
*/
actions: {
async register(ctx) {
console.log('ctx.socket: ', ctx.socket); // This is undefined
// Other code...
},
/**
* Events
*/
events: {
},
/**
* Methods
*/
methods: {
},
/**
* Service created lifecycle event handler
*/
created() {
},
/**
* Service started lifecycle event handler
*/
async started() {
},
/**
* Service stopped lifecycle event handler
*/
async stopped() {
}
};
在被调用的register()
函数中,ctx.socket
是undefined
. 我在这里想念什么?我认为它onBeforeCall()
旨在用于这种目的,但也许我误解了一些东西。
我应该或可以采用其他方法来确保套接字在被调用函数中可用吗?只是为了澄清一下,套接字在onBeforeCall()
钩子中可用。我需要弄清楚如何使它可用。