Next.js grpc-节点使用

Next.js grpc-node usage

我使用 gRPC but I have a problem initializing the service in 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 发出请求时,出现错误:

Request message serialization failure: Expected argument of type ...

错误解释: ()

That error message indicates that message serialization (transformation of the message object passed to gRPC into binary data) failed. This generally happens because the message object doesn't match the expected message type or is otherwise invalid

有谁知道我为什么会收到这个错误? 看到一些使用 Next.js 和 grpc-node 的例子也很有趣。

对于这种情况,您可以使用 Node.js global