Next.js использование grpc-узла

Я использую gRPC, но у меня проблема с инициализацией службы в Next.js.

Цель: создать клиентскую службу только один раз в приложении и использовать ее в getServerSideProps (приложение не использует маршрутизацию на стороне клиента).

Например, у нас есть служба, созданная с помощью grpc-tools (доступно только для SSR) а затем я просто хочу его где-то инициализировать. Сначала подумал, что это можно реализовать в кастоме server.js:


const { credentials } = require('@grpc/grpc-js');
const express = require("express");
const next = require("next");

const { MyserviceClient } = require('./gen/myservice_grpc_pb');

const dev = process.env.NODE_ENV !== "production";

const app = next({ dev });
const handle = app.getRequestHandler();

// Init & Export
exports.myService = new MyserviceClient(
  'http://localhost:3000',
  credentials.createInsecure(),
);

(async () => {
  await app.prepare();
  const server = express();

  server.get("*", (req, res) => handle(req, res));

  server.listen(process.env.PORT, () => {
    console.log(`Listening at http://localhost:${process.env.PORT}`);
  });
})();

А затем используйте его на главной странице, например:

import React from 'react';

const { GetSmthRequest } = require('../gen/myservice_pb');
const { myService } = require('../server.js');

const IndexPage = () => (
  <div>
    <span>My HomePage</span>
  </div>
)

const getServerSideProps = async () => {
  const request = new GetSmthRequest();
  request.setSomeStuff('random');

  myService.getStmh(GetSmthRequest, (err, res) => {
    //...
  })

  return {
    props: {

    }
  }
}

export default IndexPage;

Но по какой-то причине невозможно инициализировать клиентскую службу в server.js.


Также я пробовал делать это с помощью next.config.js:

const { credentials } = require('@grpc/grpc-js');

const { MyserviceClient } = require('./gen/myservice_grpc_pb');

module.exports = {
  serverRuntimeConfig: {
    myService: new MyserviceClient(
      'http://localhost:3000',
      credentials.createInsecure(),
    ),
  },
};

Это решение работает, поэтому я могу использовать службу через serverRuntimeConfig, тем самым инициализируя ее только один раз во всем приложении, но когда я делаю запрос где-то с помощью getServerSideProps, я получаю сообщение об ошибке:

Ошибка сериализации сообщения запроса: ожидаемый аргумент типа ...

Объяснение ошибки: (https://stackoverflow.com/a/50845069/9464680)

Это сообщение об ошибке указывает на то, что сериализация сообщения (преобразование объекта сообщения, переданного в gRPC, в двоичные данные) не удалась. Обычно это происходит из-за того, что объект сообщения не соответствует ожидаемому типу сообщения или по другим причинам недействителен.

Кто-нибудь знает, почему я получаю эту ошибку? Также интересно увидеть несколько примеров использования Next.js с grpc-node.


person Arthur    schedule 31.03.2021    source источник


Ответы (1)


В таком случае вы можете использовать Node.js global.

person Arthur    schedule 01.04.2021