Services
Services are optional, but highly recommended, components that provide additional functionality to your application. With services, you can separate your application's logic into smaller, more manageable pieces.
Creating
To create a service, you need to use the createService function. This function one argument, which a function that returns an object with the service's methods.
import { createService } from 'nixle';
export const usersService = createService('users', () => {
const getUsers = () => {
return ['John', 'Jane'];
};
return { getUsers };
});Usage
To use a service, you need to call the returned function from the createService function.
import { createRouter } from 'nixle';
import { usersService } from './usersService';
export const usersRouter = createRouter('/users', ({ route }) => [
route.get('/', () => {
const users = await usersService().getUsers();
return users;
}),
]);Parameters
You can destruct the params object to get some useful parameters.
import { createService } from 'nixle';
export const usersService = createService('users', ({ log, env }) => {
const getUsers = () => {
log.info('Getting users from site', env.SITE_URL);
return ['John', 'Jane'];
};
return { getUsers };
});More
To use more parameters, you can install additional plugins. For example, the @nixle/zod plugin adds the zodObject parameter that allows you to validate any object.
import { createService } from 'nixle';
export const usersService = createService('users', ({ zodObject }) => {
const getUsers = (user) => {
const { validate } = zodObject((zod) => ({
email: zod.string().email(),
password: zod.string().min(8),
}));
return validate(user);
};
return { getUsers };
});TypeScript
Services are fully typed. You can use the $inferMethods and $inferReturns properties to infer the service's methods and return types.
import { createService } from 'nixle';
export const usersService = createService('users', () => {
const getUsers = () => {
return ['John', 'Jane'];
};
return { getUsers };
});
type UsersServiceReturns = typeof usersService.$inferMethods;
// type UsersServiceReturns = {
// getUsers: () => string[];
// }
type UsersServiceReturns = typeof usersService.$inferReturns;
// type UsersServiceReturns = {
// getUsers: string[];
// }