Nexus NF v0.4.1
Nexus NF or Nexus NATS Framework is a lightweight and easy-to-use framework for building NATS microservices using TypeScript. Nexus utilizes NATS’s built-in service API to register services, endpoint groups and endpoints.
⚠️ Early Development: NexusNF is currently in very early stages of development. Expect changes, missing features and bugs. Please report issues on GitHub.
It is highly recommended to use the project generation script to create your NexusNF service.
npx create-nexus-service
// index.ts
import { connect } from 'nats';
import { Controller, Endpoint, NexusApp } from 'nexus-nf';
interface MathMessage {
firstNumber: number;
secondNumber: number;
}
@Controller('math')
class MathController {
@Endpoint('add')
async add(message: MathMessage) {
return message.firstNumber + message.secondNumber;
}
@Endpoint('multiply')
async multiply(message: MathMessage) {
return message.firstNumber * message.secondNumber;
}
}
// Connect to NATS and register the service
const nc = await connect();
const service = await nc.services.add({
name: 'example-service',
version: '1.0.0',
});
const app = new NexusApp(nc, service);
// Register the controller class
app.registerController(new MathController());
Note that the MathMessage
interface here is just for TypeScript hinting. For
runtime endpoint data validation see schema validation
example.
Requesting the declared endpoint
nats request "math.add" '{"firstNumber": 10, "secondNumber": 15}'
# {"error":false,"data":25}
nats request "math.multiply" '{"firstNumber": 6, "secondNumber": 10}'
# {"error":false,"data":60}
Errors thrown from endpoint handlers are automatically transformed into an error response.
@Controller('example')
class ExampleController {
@Endpoint('error')
async exampleError() {
throw new NatsError('This is an example error', '500');
}
}
nats request "example.error" ""
# {"error":true,"message":"This is an example error","code":"500"}
NexusNF can integrate with Zod for runtime data validation
and message parsing. The provided schema
in the @Endpoint
’s options will be
used to validate the incoming message body.
npm install zod
import * as z from 'zod';
const MathSchema = z.object({
firstNumber: z.number(),
secondNumber: z.number(),
});
type MathPayload = z.output<typeof MathSchema>;
@Controller('math')
class MathController {
@Endpoint('add', { schema: MathSchema })
async add(message: MathPayload) {
return message.firstNumber + message.secondNumber;
}
}
nats request "math.add" '{"firstNumber": 10, "secondNumber": 15}'
# {"error":false,"data":25}
nats request "math.add" '{"firstNumber": 10, "secondNumber": true}'
# {"error":true,"code":"400","message":"Bad Request: Validation failed.","details":[{"expected":"number","code":"invalid_type","path":["secondNumber"],"message":"Invalid input: expected number, received boolean"}]}
git checkout -b feature/my-awesome-feature
npm install
npm test