Я использую 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.