Подключение к серверу Typescript JSON RPC через клиент Go

У меня есть машинописный JSON RPC-сервер и клиент Go. Я следовал различным руководствам по настройке сервера и клиента, однако у меня возникли проблемы со связью между ними. В настоящее время я пытаюсь подключиться к ним локально, поэтому использую stdin/stdout для связи между ними.

Это мой серверный код:

import * as jsonrpc from 'vscode-jsonrpc/node';

const connection = jsonrpc.createMessageConnection(
    new jsonrpc.StreamMessageReader(process.stdin),
    new jsonrpc.StreamMessageWriter(process.stdout)
);

connection.onRequest('testRequest', (params: any) => {
    console.info('in test request');
    return 'testRequest response';
});

connection.listen();

console.info('listening...');

А это мой клиентский код (я вызываю ConnectAndSendRequest в основном):

package testConnection

import (
    "context"
    "io"
    "os/exec"

    "github.com/sourcegraph/jsonrpc2"
)

type stdrwc struct {
    in  io.WriteCloser
    out io.ReadCloser
}

func (c *stdrwc) Read(p []byte) (int, error) {
    return c.out.Read(p)
}

func (c *stdrwc) Write(p []byte) (int, error) {
    return c.in.Write(p)
}

func (c *stdrwc) Close() error {
    if err := c.in.Close(); err != nil {
        return err
    }
    return c.out.Close()
}

func ConnectAndSendRequest() error {
    cmd := exec.Command("<my server>")
    stdout, err := cmd.StdoutPipe()
    if err != nil {
        return nil, err
    }

    stdin, err := cmd.StdinPipe()
    if err != nil {
        return nil, err
    }

    if err := cmd.Start(); err != nil {
        return nil, err
    }

    conn := jsonrpc2.NewConn(context.Background(), jsonrpc2.NewBufferedStream(&stdrwc{stdin, stdout}, jsonrpc2.VSCodeObjectCodec{}), nil)
    defer conn.Close()

    var res string
    err := p.Ev2LSConnection.Call(context.Background(), "testRequest", &res)
    if err != nil {
        return err
    }
    log.Println(res)
    return nil
}

Когда я запускаю программу go, я вижу журнал listening... в командной строке сервера, но не in test request. Программа go просто зависает, пока я не закрою командную строку сервера. Когда сервер закрыт, я просто получаю err: jsonrpc2: connection is closed в командной строке go cmd.

Я подозреваю, что мой stdin/stdout на сервере или клиенте настроен неправильно, поэтому сервер не получает запросы от клиента. Кто-нибудь, имеющий опыт в этом, знает, что может быть не так?

Добавили ли вы ведение журнала в код Go, чтобы увидеть, где он зависает?

Steve D 15.06.2024 09:23
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Мне нравится библиотека Mantine Component , но заставить ее работать без проблем с Remix бывает непросто.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
TypeScript против JavaScript
TypeScript против JavaScript
TypeScript vs JavaScript - в чем различия и какой из них выбрать?
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Не все нужно хранить на стороне сервера. Иногда все, что вам нужно, это постоянное хранилище на стороне клиента для хранения уникальных для клиента...
Что такое ленивая загрузка в Angular и как ее применять
Что такое ленивая загрузка в Angular и как ее применять
Ленивая загрузка - это техника, используемая в Angular для повышения производительности приложения путем загрузки модулей только тогда, когда они...
1
1
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Теперь я разобрался с проблемами. Было несколько проблем.

Первая проблема: путь к серверу (<<my server>>) был неправильным, поэтому, когда я попытался создать соединение, на самом деле ничего не было создано. Когда я пытался отправлять запросы, я видел ошибку jsonrpc2: connection is closed.

Вторая проблема заключалась в том, что я отправлял журналы (используя console.info()) на сервер Typescript, однако я также использовал консоль Typescript для связи между сервером и клиентом, поэтому клиент go не мог понять вывод. Как только я удалил логи на стороне TS, все заработало от начала до конца.

Другие вопросы по теме