javascript - 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',
})
我需要有关自定义元数据的帮助,以便我可以使用不记名身份验证
解决方案
- 下载此项目https://github.com/gregwhitaker/springboot-rsocketjwt-example并运行自述文件中描述的所有示例以确保一切正常。
- 在项目
application.properties
中hello-service
添加spring.rsocket.server.transport=websocket
. - 像这样写你的 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
推荐阅读
- c++ - OPENCV - 如何在 OpenCV 中使用 Haar 级联 Github xml 文件?
- suitescript - Netsuite 套件脚本 2.0
- java - 如何在 spring-integration 中停止消息?
- google-app-engine - 谷歌端点迁移到版本 2 后,参数 Named("key") Key key 未显示在 api explorer 中
- css - 如何使用 postcss 管理我网站中的托管字体?
- vba - 试图从连接的字符串中收集日期
- python - 对数据框列进行计算的最优雅方法
- amazon-web-services - 如何从 S3 下载大型 csv 文件而不会遇到“内存不足”问题?
- jquery - 如何在 jquery 中使用 php for 循环 for fullcalender.js 和 laravel?
- dataframe - 转置后的 Data.frame 和 data.frame 仍然将变量作为非数字