npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

express-api-loader

v1.1.1

Published

Enhance API writing experience

Downloads

8

Readme

express-api-loader

NPM version

Enhance API writing experience in declarative way with Express.js.

We'd like to provide a new way as below:

/**
 * @method get
 * @api /users/:id
 */
module.exports.getUsers = function(req, res) {
  const { url, originalUrl, params } = req

  res.json({
    url,
    originalUrl,
    id: params.id
  })
}

It's declarative, all you need for API writing is giving a proper annotation, @method - for http method definition; @api - for API path. And nothing else.

You don't have to worry about how router organized any more.

Install

yarn

yarn add express-api-loader

npm

npm install --save express-api-loader

Import

const { withExpressApp } = require('express-api-loader')

Quick Start

Let's say you have apis/users/user.js as below:

/**
 * @method get
 * @api /users/:id
 */
module.exports.getUsers = async function(req, res) {
  const { url, originalUrl, params } = req

  res.json({
    url,
    originalUrl,
    id: params.id
  })
}

How can we get it up and running as APIs? see:

const express = require('express')
const { resolve } = require('path')
const { withExpressApp } = require('express-api-loader')

// create express app as usual
const app = express()

// scan API files and register as routers automatically
withExpressApp(app)({
  scanOpts: {
    cwd: resolve(__dirname, 'apis'), // where to start scanning
    pattern: '**/*.js', // which file will be loaded as API declaration
    ignore: ['**/_*.js'] // which file will be ignored from scanning
  },
  apiPrefix: '/apis' // will be prepended in every api path
})

app.listen(9876, () => {
  console.log('server running at 9876')
})

try

curl http://localhost:9876/apis/users/123?name=hello

to see the result.

Methods

withCors(app: express.Express)

Enable Cross-Origin Resource Sharing

withExpressApp(app: express.Express)

Setup scan options for API initialization

withLogger(opts)

Provide specific logger implementation. console.log/warn/error is used by default

withRequestHandler(app: express.Express, customHandler: (function(bodyParser): any))

Setup request middlewares as needed. app.use(bodyParser.json()) by default

withResponseHandler(opts: {onNormalResponse: function, onErrorResponse: function})

Setup response transformer for normal/error case individually while fast return {value} with @api

Properties

logger

Log information

ResponseError

You have to use this custom error implementation while throwing error within @api

LICENSE

MIT License