首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >即使在将套接字附加到moleculer.io中的` `beforeCall()`钩子中的`ctx`之后,仍获得‘unfined`值

即使在将套接字附加到moleculer.io中的` `beforeCall()`钩子中的`ctx`之后,仍获得‘unfined`值
EN

Stack Overflow用户
提问于 2021-02-12 21:33:47
回答 2查看 119关注 0票数 0

我在后端使用moleculerjs来处理微服务,并且使用其中一个前端应用程序来处理套接字上的通信。为了做到这一点,我使用了moleculer.io。我遇到的问题是,即使我将套接字附加到onBeforeCall()钩子中的ctx,当我在控制器函数中console.log ctx时,套接字也不在那里。

我的网关如下所示(请注意,套接字正被添加到onBeforeCall()挂钩中的ctx对象:

代码语言:javascript
复制
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看起来是这样的-注意尝试访问ctx.socketregister()函数

代码语言:javascript
复制
"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.socketundefined。这里我漏掉了什么?我假设onBeforeCall()就是为这种目的而设计的,但也许我误解了什么。

有没有不同的方法来确保套接字在被调用的函数中可用?为了澄清,套接字在onBeforeCall()钩子中可用。我需要弄清楚如何让它在未来可用。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-02-12 22:26:13

最后我找到了一种方法来做到这一点。正如@Icebob指出的那样,我不能直接将套接字附加到ctx,而是能够将其附加到ctx.meta,如下所示:

代码语言:javascript
复制
onBeforeCall: async function(ctx, socket, action, params, callOptions) { // before hook
  ctx.meta.socket = socket;
},

通过这样做,我能够在我的register()函数中成功地访问套接字。

票数 0
EN

Stack Overflow用户

发布于 2021-02-12 22:01:24

你不能这么做。您不能将任何内容放入ctx。ServiceBroker将只序列化和传输ctx.paramsctx.meta属性。但是您不能将套接字放入其中,因为您喜欢的套接字对象是不可序列化的,因此您不能在远程服务中访问它。它可以在整体项目中工作,而不是在微服务项目中工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66172801

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档