0.1.7 • Published 5 years ago

@synvox/base v0.1.7

Weekly downloads
9
License
-
Repository
-
Last release
5 years ago

@synvox/base

A small Node.js router with middleware inspired by React hooks

npm i @synvox/base

Features

  • express style routing
  • composable sub routers
  • lightweight
  • getters that resemble react hooks
  • api inspired by zeit/micro

Basic Example

import http from 'http';
import { base, Router, getJson } from '@synvox/base';

const app = Router();

let name = 'World';

app.get('/', () => {
  return `Hello ${name}`;
});

app.post('/', async req => {
  const body = await getJson(req);
  name = body.name;
  return 'Ok';
});

http.createServer(base(app)).listen(3000);

Getters instead of middleware

With base you can create your own getters that replace the need for most middleware.

import { base, Router, getJson } from '@synvox/base';
import { connect, createError } from '@synvox/sql';

const sql = connect();

export const getUser = createGetter(async req => {
  const user = await sql`
    select * from users
    join user_tokens on users.id = user_tokens.user_id
    where user_tokens.id=${req.headers.token}
  `;

  if (!user) throw createError(401);

  return user;
});

export const isAdmin = createGetter(async req => {
  return await getUser(req).isAdmin;
});

// elsewhere
import { createError } from '@synvox/base';
import { getUser } from './getters';

app.get('/whoami', async req => {
  return await getUser(req);
});

app.get('/admin', async req => {
  const user = await getUser(req);
  const isAdmin = await isAdmin(req);
  if (!isAdmin) throw createError(401);

  // etc...
});

getters that are created with createGetter are memoized by req so in the previous example, calling getUser multiple times results in a single query to the database.

Responding to requests

Returning JSON

Returning JavaScript objects will result in them being sent as JSON.

reply

Return reply(body, [status], [headers]) to send a response with a status code or headers.

createError

Throw createError(status, [message]) to send a server error.

Built in getters

getText

Get the body of a request as plaintext.

getJson

Get the body of a request as JSON.

getQueryParams

Get the query parameters of a request as a JavaScript object.

getUrlParams

Get the url parameters of a request as a JavaScript object.

Routing examples

import { Router } from '@synvox/base';
const app = Router();

app.get('/', () => {
  return 'GET!';
});

app.post('/echo', async req => {
  const body = await getText(req);
  return body;
});

const subApp = Router();

subApp.get('/');

app.use('/sub', subApp); // now all subApp endpoints are prefixed with /sub