首页 > 解决方案 > Javascript Rsocket 自定义元数据 - RSocket 错误 0x201 (APPLICATION_ERROR):没有目标处理程序

问题描述

我尝试按照 spring-flights 示例进行操作,但我不断收到 RSocket 错误 0x201 (APPLICATION_ERROR): No handler for destination。

元数据.js

import {JsonSerializer} from 'rsocket-core';

export class Metadata extends Map {

  constructor(json) {
      super();
      if (json != null) {
          for (let [key, value] of json) {
              this.set(key, value);
          }
      }
  }

  toJSON() {
      const result = {};
      for (let [key, value] of this.entries()) {
          result[key] = value;
      }
      return result;
  }

}

Metadata.ROUTE = "route";
Metadata.AUTHENTICATION_BEARER = "message/x.rsocket.authentication.bearer.v0";

export const JsonMetadataSerializer = {

  deserialize(data) {
    if (data == null) {
        return null;
    }
    let json = JsonSerializer.deserialize(data);
    return new Metadata(json);
  },

  serialize(metadata) {
    if (metadata == null) {
        return null;
    }
    let json = metadata.toJSON();
    return JsonSerializer.serialize(json);
  }

};

JsonMetadataSerializer.MIME_TYPE = "application/vnd.spring.rsocket.metadata+json";

但是如果没有自定义元数据,它可以很好地工作。

serializers: {
            data: JsonSerializer,
            metadata: IdentitySerializer
}
metadataMimeType: 'message/x.rsocket.routing.v0',
socket.requestStream({ 
   metadata: String.fromCharCode('greet-stream'.length) + 'greet-stream',
})

我需要有关自定义元数据的帮助,以便我可以使用不记名身份验证

标签: javascriptjavaspring-bootspring-webfluxrsocket

解决方案


  1. 下载此项目https://github.com/gregwhitaker/springboot-rsocketjwt-example并运行自述文件中描述的所有示例以确保一切正常。
  2. 在项目application.propertieshello-service添加spring.rsocket.server.transport=websocket.
  3. 像这样写你的 rsocket-js 客户端:
      const host = "127.0.0.1";
      const port = 8080;
      const keepAlive = 60000;
      const lifetime = 180000;
      const dataMimeType = "application/octet-stream";
      const metadataMimeType = MESSAGE_RSOCKET_COMPOSITE_METADATA.string;
      const route = "hello.secure";
      const bearerMimeType = "message/x.rsocket.authentication.bearer.v0";
      const jwtToken =
        "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1c2VyIiwiYXVkIjoiaGVsbG8tc2VydmljZSIsInNjb3BlIjoiVVNFUiIsImlzcyI6ImhlbGxvLXNlcnZpY2UtZGVtbyIsImV4cCI6MTU4ODMxNzE1OSwianRpIjoiZjQxZmZiYWUtNTk5My00YWU5LTkwMWMtMjU1ODY4NzEyYzZhIn0.VZlQ_rFTtwGukdVMBy_3VUI1EhfdzXLNPkylygUJUbQ";

      const client = new RSocketClient({
        setup: {
          keepAlive,
          lifetime,
          dataMimeType,
          metadataMimeType
        },
        transport: new RSocketWebSocketClient(
          {
            wsCreator: () => new WebSocket("ws://localhost:7000"),
            debug: true
          },
          BufferEncoders
        )
      });

      // Open the connection
      client.connect().then(socket => {
        socket
          .requestResponse({
            data: new Buffer("request-response JWT JS client"),
            metadata: encodeAndAddWellKnownMetadata(
              encodeAndAddCustomMetadata(
                Buffer.alloc(0),
                bearerMimeType,
                Buffer.from(jwtToken)
              ),
              MESSAGE_RSOCKET_ROUTING,
              Buffer.from(String.fromCharCode(route.length) + route)
            )
          })
          .subscribe({
            onComplete: data => {
              console.log("got response with requestResponse");
              const response = data.data.toString();
              console.log(response);
            },
            onError: error => {
              console.log("got error with requestResponse");
              console.error(error);
            },
            onSubscribe: cancel => {
              /* call cancel() to stop onComplete/onError */
            }
          });
      });

在浏览器控制台中,您应该看到:

got response with requestResponse
Hello, request-response JWT JS client! - from secured method

推荐阅读