Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/jacobwgillespie/zap
⚡ A lightweight HTTP server framework for Node.
https://github.com/jacobwgillespie/zap
Last synced: about 2 months ago
JSON representation
⚡ A lightweight HTTP server framework for Node.
- Host: GitHub
- URL: https://github.com/jacobwgillespie/zap
- Owner: jacobwgillespie
- License: mit
- Created: 2021-07-04T13:51:28.000Z (over 3 years ago)
- Default Branch: main
- Last Pushed: 2024-09-20T03:07:54.000Z (3 months ago)
- Last Synced: 2024-10-11T18:16:42.947Z (2 months ago)
- Language: TypeScript
- Homepage: https://www.npmjs.com/package/zap
- Size: 95.7 KB
- Stars: 6
- Watchers: 2
- Forks: 1
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# ⚡ zap [![npm](https://badgen.net/npm/v/zap)](https://www.npmjs.com/package/zap) [![CI](https://github.com/jacobwgillespie/zap/actions/workflows/ci.yml/badge.svg)](https://github.com/jacobwgillespie/zap/actions/workflows/ci.yml)
Zap is a lightweight HTTP server framework for Node.
- [Installation](#installation)
- [Usage](#usage)
- [API](#api)
- [Recipes](#recipes)
- [Credits](#credits)
- [License](#license)## Installation
Install with your favorite package manager:
```shell
$ pnpm add zap
$ yarn add zap
$ npm install zap
```## Usage
```typescript
import {route, router, serve} from 'zap'const app = router(
route('GET', '/', () => 'Hello World'),route('GET', '/hello/:name', (req) => `Hello ${req.params.name}`),
)const server = http.createServer(serve(app))
server.listen(3000)
```## API
### `serve(handler, options)`
Constructs a new `http.RequestListener` out of a `Handler`.
### `router(...routes)`
Constructs a new `Handler` out of a list of `RouteHandlers`.
### `route(method, path, handler)`
Constructs a `RouteHandler` that matches a given method (`GET`, `POST`, etc) and path.
### Body parsers
- `buffer(req, options)` - read the request body as a `Buffer`
- `text(req, options)` - read the request body as a string
- `json(req, options)` - read the request body as parsed JSON### Request helpers
- `getHeader(req, header)` - returns the requested header if it was provided
- `fromRequest(fn)` - wraps a function in the form `(req: ServerRequest, ...rest) => any` to return an equivalent function that caches its results for the provided request### Response helpers
- Ordinarily you would return a `ResponseBodyType` from a `Handler` function
- `send(res, statusCode, body)` - a response with a given status code
- `notFound()` - a 404 response
- `redirect(location, statusCode)` - a redirect to another location (default status code 303)
- `httpError(code, message, metadata)` - an error response with a given code, message, and optional metadata## Recipes
### Validating body schema
You can use a function that throws an `httpError` to provide type-safe body payload parsing:
```typescript
async function parseBody(req: ServerRequest) {
const body = await json(req)
if (!validate(body)) throw httpError(400, 'invalid body')
return body
}route('POST', '/example', (req) => {
const body = await parseBody(req)
// body is now typed according to your parseBody return type
})
```### Error handling
The `serve()` function options accept an `errorHandler` that will replace `zap`'s built-in error handler. This allows you to report errors to services like Sentry, format the response sent to the user, etc.
```typescript
serve(handler, {
errorHandler: (_, res, error) => {
send(res, 500, {message: 'Internal server error', details: formatError(error)})
},
})
```## Credits
Special thanks to [@nornagon](https://github.com/nornagon) for the `zap` package name. For versions of this module published before `v1.0.0`, see [nornagon/node-zap](https://github.com/nornagon/node-zap).
## License
MIT License, see `LICENSE`.