NestJS 使用microservice

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NestJS 使用microservice相关的知识,希望对你有一定的参考价值。

参考技术A 这里我使用的nrwl来初始化nest项目, nest cli 之类同理可以初始化项目出来

nestjs提供connectMicroService 和createMicroSerivice.
两者的不同点是在connectMicroService 是以一个socket主服务的额外服务存在.
由于nestjs支持多种服务化运行, 如http grpc 等等, socket主服务大部门可能大部份以http形式启动运行.
createMicroSerivice 是主服务就是微服务, 初入nestjs可以看下两个函数的api, 它们是非常不同的.
现在做测试, 用connectMicroService ,

好, 起了一个5557的tcp微服务.

TCP的TCP服务其实是一个自定义的带长度的JSON数据SOCKET
传输格式为 len(int)#(char)json_str(string) 中间的#是固定的.
大致形式为 13#"foo":"bar" 这里json格式是任意写的, 实际上json有固定的字段.
"partern": any, "data":any, "id"?:number partern是一个可以序列化的object或字符串, 用于生成token, 生成token时key会做递归排序. id是可选的, 当id传了时, tcp服务端会返回一个销毁的消息
他大致像"partern": "destroy", , "id":20

所有的微服务需要映射到 类似 "partern": "destroy", 的数据结构, 当然自己写类不用 partern 也是可行的, 自已的Controller注解不要继承于ParternMessage即可.
其他基于TCP的二进制数据转到对像时, 这个对像最好继承"partern": any, "data":any, "id"?:number , key值存在即可, partern 还要当token用, 用于Controller映射到请求

Nestjs - @nestjs/graphql GraphQLGatewayModule 总是返回错误请求

【中文标题】Nestjs - @nestjs/graphql GraphQLGatewayModule 总是返回错误请求【英文标题】:Nestjs - @nestjs/graphql GraphQLGatewayModule always returns Bad Request 【发布时间】:2020-07-01 18:44:16 【问题描述】:

我正在尝试使用来自 @nestjs/graphql 的 GraphQLGatewayModule 模块。

为了测试,我正在免费使用 GraphQL API:https://anilist.co/graphiql

但我总是得到 HTTP 400 状态。

我的代码:

import  Module  from '@nestjs/common';
import  GraphQLGatewayModule  from '@nestjs/graphql';

@Module(
  imports: [
    GraphQLGatewayModule.forRoot(
      server: 
        // ... Apollo server options
        debug: true,
        cors: true
      ,
      gateway: 
        debug: true,
        serviceList: [ name: 'TEST_GRAPHQL_GATEWAY', url: 'http://user-service:3000/graphql' ],
      
    )
  ]
)
export class AppModule  

我总是得到 HTTP 400 状态。但是这个api没问题。我收到这条消息:

Encountered error when loading TEST_GRAPHQL_GATEWAY at http://user-service:3000/graphql: 400: Bad Request
[INFO] Fri Mar 20 2020 17:52:20 GMT+0000 (Coordinated Universal Time) apollo-gateway: Gateway successfully loaded schema.
    * Mode: unmanaged
(node:368) UnhandledPromiseRejectionWarning: Error: Expected undefined to be a GraphQL schema.
    at assertSchema (/app/node_modules/graphql/type/schema.js:41:11)
    at validateSchema (/app/node_modules/graphql/type/validate.js:44:28)
    at assertValidSchema (/app/node_modules/graphql/type/validate.js:68:16)
    at assertValidExecutionArguments (/app/node_modules/graphql/execution/execute.js:136:35)
    at executeImpl (/app/node_modules/graphql/execution/execute.js:86:3)
    at Object.execute (/app/node_modules/graphql/execution/execute.js:64:63)
    at Object.generateSchemaHash (/app/node_modules/apollo-server-core/dist/utils/schemaHash.js:14:32)
    at ApolloServer.generateSchemaDerivedData (/app/node_modules/apollo-server-core/dist/ApolloServer.js:282:41)
    at ApolloServerBase.schemaDerivedData._schema.then.schema (/app/node_modules/apollo-server-core/dist/ApolloServer.js:206:66)
    at process._tickCallback (internal/process/next_tick.js:68:7)
(node:368) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:368) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

我是否以错误的方式使用 GraphQLGatewayModule?

谢谢!

【问题讨论】:

【参考方案1】:

解决了!

我使用的是旧版本的 @nestjs/graphql,它没有 GraphQLFederationModule 模块。我试图将 USER api 与 GraphQLModule 模块一起使用

【讨论】:

以上是关于NestJS 使用microservice的主要内容,如果未能解决你的问题,请参考以下文章

Nestjs 使用 axios

使用 NestJS 和 TypeOrm,在我运行 NestJS 应用程序后不会自动创建表

使用 NestJS 框架分析概念实现

NestJS - 使用 DotEnv

从使用 nestjs API 应用程序调试 npm 库(使用 noidejs、nestjs 和 typescript 构建)

NestJS:转换响应