API Services Made Easy With Node.js

Related tags

Web Frameworks nodal
Overview

Nodal

API Services Made Easy with Node.js

Build Status Join the chat at https://gitter.im/keithwhor/nodal

Nodal Logo

View the website at nodaljs.com.

Nodal is a web server and opinionated framework for building data manipulation-centric (Create Read Update Destroy) API services in Node.js for web, mobile or IoT apps.

Why Nodal?

Hello, Nodal — Building Node.js Servers for Everybody is our first blog post that helps you get acquainted with the reasons behind the creation of the framework. :)

Post Parse Prototyping is also a fantastic read explaining the benefits of Nodal for quick and easy mobile / IoT backend development.

Overview

Nodal is built upon an ideology of a robust, scalable architecture for data storage and retrieval APIs. It is an opinionated, explicit, idiomatic and highly-extensible full-service framework that takes care of all of the hard decisions for you and your team. This allows you to focus on creating an effective product in a short timespan while minimizing technical debt.

Nodal servers are not meant to be monoliths. They're stateless and distributed, meant to service your needs of interfacing with your data layer effortlessly. While you can output any data format with Nodal, it's recommended you offload things like static page rendering to other optimized services like CDNs.

Check out the first Nodal Screencast here.

Stateless Dogma

It's important to note that Nodal is meant for stateless API services. This means you should not rely on memory within a specific process to serve multiple requests, and Nodal will use process clustering (even in development) to actively discourage this practice. If you need to work with unstructured data for rapid prototyping, connect Nodal to a PostgreSQL database and use the "JSON" field type. You'll find yourself encountering a lot of trouble if you start trying to use in-process memory across different requests.

Remember: one input, one output. Side effects dealing with model state should be managed via your Database. Nodal should not be used for streaming (long poll) requests and the HTTP request and response objects are intentionally obfuscated.

This also means you can not rely on socket connections. If you need to incorporate realtime functionality in your application, there should be a separate server responsible for this. It can interface with your Nodal API server and even receive events from it, but your API server should never have a stateful (prolonged) connection with any client.

Getting Started

Getting started with Nodal is easy.

  1. Download and install the newest Node 6.x version from nodejs.org
  2. Open terminal, and type npm install nodal -g. (If you get an error, run sudo npm install nodal -g or fix permissions permanently by following these directions
  3. Using your terminal, visit your projects folder. Perhaps with cd ~.
  4. Run nodal new.
  5. Follow the on screen instructions, enter your new project directory and type nodal s.

That's it! Your Nodal webserver is up and running.

Hooking Up Your Database

Once Nodal is up and running, it's likely that you'll want to connect your project to a database. Nodal comes packaged with Migrations, a Query Composer and full PostgreSQL integration.

First you'll need to install PostgreSQL. OS X users, I recommend using Postgres.app for your development environment.

Once you've installed Postgres, make sure to run:

$ createuser postgres -s

To create a default postgres superuser with no password. (Default for Nodal's configuration.)

To begin using your database, start with:

$ nodal db:create

To create the database and then,

$ nodal db:prepare

To prepare for migrations.

From here, nodal db:migrate runs all pending migrations and nodal db:rollback will roll back migrations, one at a time by default.

Server Types

Nodal works best when you follow its ideology, and that means creating a new service to solve specific Problem Domains of your application and business.

The main three suggestions are Branding Server, API Server and Application Server.

Nodal's core competency is building API servers. We do, however, also have a project called dotcom for building Branding Servers (search engine optimized server-generated pages). More on this soon.

API Server

Create an API server using Nodal's Models, PostgreSQL integration, built-in JSON API formatting, and Query Composer (ORM). Bi-directional migrations are packaged with Nodal, meaning you can maintain the integrity of your data. User (including password) and OAuth AccessToken models and controllers are pre-built for you and can be added easily to your project.

Packaged with Nodal are workers, scheduling modules, and much more for all of your data needs.

We can look at what an API Controller might look like for, say, blog posts:

class BlogPostsController extends Nodal.Controller {

  index() {

    BlogPost.query()
      .join('user')
      .join('comments')
      .where(this.params.query)
      .end((err, blogPosts) => {

        this.respond(err || blogPosts);

      });

  }

  show() {

    BlogPost.find(this.params.route.id, (err, blogPost) => this.respond(err || blogPost));

  }

  create() {

    BlogPost.create(params.body, (err, blogPost) => this.respond(err || blogPost));

  }

  update() {

    BlogPost.update(this.params.route.id, params.body, (err, blogPost) => this.respond(err || blogPost));

  }

  destroy() {

    BlogPost.destroy(this.params.route.id, (err, blogPost) => this.respond(err || blogPost));

  }

}

Beginner's Guide

You'll be able to learn more about Nodal at nodaljs.com.

Documentation

Check out the website at nodaljs.com.

Roadmap

View the roadmap at ROADMAP.md.

About

Nodal is under active development and maintained by Keith Horwood.

Contributors welcome!

Follow me on Twitter, @keithwhor

Fork me on GitHub, keithwhor

Thanks for checking out Nodal!

Comments
  • Development environment setup

    Development environment setup

    It seems like the current recommendation for setting up a development environment is to manually install and configure a Postgres server. I'm going to suggest using [Docker Compose(https://docs.docker.com/compose/) as an alternative. I tried this myself with Nodal and it makes things a breeze. Basically the getting started would be reduced to docker-compose up. (Assuming Docker and Docker Compose are installed.)

    Note that this doesn't necessarily preclude users from continuing to use their own setup, but given how popular Docker currently is, I suspect a lot of people would prefer the Docker route. Aside from documentation, only three changes are needed:

    Add a Dockerfile to build a container for the Nodal app

    FROM node
    EXPOSE 3000
    
    RUN npm install -g --silent nodal
    
    WORKDIR /usr/src/app
    CMD ["npm", "start"]
    

    Add docker-compose.yml to define the service configuration

    web:
      build: .
      ports:
       - "3000:3000"
      volumes:
       - .:/usr/src/app
      links:
       - db
      environment:
       - DATABASE_HOST=db
       - DATABASE_PORT=5432
       - DATABASE_USER=nodal
       - DATABASE_PASSWORD=nodal
       - DATABASE_DB=nodal_development
    db:
      image: postgres
      environment:
       - POSTGRES_USER=nodal
       - POSTGRES_PASSWORD=nodal
       - POSTGRES_DB=nodal_development
    

    Modify the development database configuration to use environment variables

    This is the only slightly tricky bit. For the above to work, the production and development database configuration would have to be the same since the above relies on environment variables. However, I think this is actually an added bonus. If users don't want to use Docker, then using something like dotenv to read a set of environment variables configuring a local server would be an easy alternative.

    I'm happy to put together a PR if this sounds like something you're interested in.

    roadmap 
    opened by michaelmior 18
  • 501 - Not Implemented in PUT verb

    501 - Not Implemented in PUT verb

    Hello friends. My API is returning this error when I try to update a register by PUT verb. Am I doing something wrong?? Is PUT the correct ver to use to update??

    Thanks since sow!

    opened by cezarpretto 17
  • nodal s error on windows 7

    nodal s error on windows 7

    Hi, i followed the getting started guide and when i try execute nodal s command i get this exception:

    events.js:141
          throw er; // Unhandled 'error' event
          ^
    
    Error: spawn npm ENOENT
        at exports._errnoException (util.js:856:11)
        at Process.ChildProcess._handle.onexit (internal/child_process.js:178:32)
        at onErrorNT (internal/child_process.js:344:16)
        at doNTCallback2 (node.js:452:9)
        at process._tickCallback (node.js:366:17)
        at Function.Module.runMain (module.js:459:11)
        at startup (node.js:138:18)
        at node.js:974:3
    

    Pls tell me what i doing wrong.

    opened by devmetal 14
  • Negative interface matching?

    Negative interface matching?

    So instead of defining [id, username, created_at] as interface wouldn't it be better to do allow for the opposite and only define the things to hide?

    I propose thse following syntax: ['!password'] will hide the password and use all default fields. This should also work in cascade relationships like [{user: ['!password']}].

    Now I don't need to worry to keep updating the interfaces everywhere when I created or remove a field from my model.

    opened by Anachron 13
  • Add simple Docker Compose configuration

    Add simple Docker Compose configuration

    Here's the start of a PR to add Docker Compose integration as mentioned in #37. To get this working, you'll need to install Docker and Docker Compose. Running nodal new will now add the Docker Compose configuration to the generated project.

    To start the server in the development environment, run docker-compose up. This will take a while the first time since it needs to download the Postgres and Node.js containers. When it's up you'll see the usual log output from running the development server.

    Note that if you want to run any commands which modify the database, you'll have to run them in the container. For example:

    docker-compose run web nodal db:create

    As mentioned in the original issue, there's still the outstanding issue of how to manage configuration. I'm personally in favour of not having separate sections in the configuration file for development and production and just using environment variables for everything. For this first pass I just copied the production DB config over to development.

    enhancement 
    opened by michaelmior 12
  • Promises

    Promises

    Given they're in the language standard now, it would probably be the better idea to use them or at least support them - especially since people want to use async/await or generator coroutines in new code.

    opened by benjamingr 12
  • Websocket for API services.

    Websocket for API services.

    Hi @keithwhor, thanks for this amazing framework, I'm really happy to finally have a Django-like ORM to work with in Node JS.

    I just want to ask you, What are your thoughts about Websocket support?, It would be great if API server works with Websocket, updating subscribers when a given model have CUD operations.

    roadmap 
    opened by chesstrian 11
  • Conditional join on one to one relationship

    Conditional join on one to one relationship

    I have two tables, properties and work_orders. I need to create a relationship where I get work_orders (id, property_id, ...) and join to properties (id, company_id, ...) using the 'property_id' column in the work_orders table joined to the 'id' column of properties. Then I need to do a conditional join where I restrict the result set of work_orders by the 'company_id' column in properties.

    I have the following relationship:

    Property.joinsTo(WorkOrder, {via: 'id', multiple: false });
    

    And the following query in work_orders_controller.js (Hopefully the conditional join syntax I am using is correct, please let me know if this looks incorrect):

        this.params.query['property__company_id__is'] = this.auth_params.user.company_id;
    
        WorkOrder.query()
          .where(this.params.query)
          .join('property', { company_id__is: this.auth_params.user.company_id })
          .end((err, models) => {
            this.respond(err || models, 
            [
              'id',
              'name',
              {'property':
                [
                  'id',
                  'name',
                  'company_id'
                ]
              }
            ]);
          });
    

    However the results set is joining the 'id' of property to the 'id' of work_order instead of the 'property_id' column. Is there a way to specify which column in the parent table to join the child table to (properties.id => work_orders.property_id)?

    opened by somecallmemike 10
  • Cannot Start Server

    Cannot Start Server

    I have Node 5.3.0.

    I have installed Nodal.

    If I run nodal new, then nodal s, I get this error message:

    [email protected] start /Users/tbrady/Development/nodalTest/my-nodal-project node server.js --harmony_classes

    { [Error: ENOENT: no such file or directory, open '.env'] errno: -2, code: 'ENOENT', syscall: 'open', path: '.env' } [Nodal.Daemon] Startup: Initializing [Nodal.Daemon] Startup: Spawning HTTP Workers { [Error: ENOENT: no such file or directory, open '.env'] errno: -2, code: 'ENOENT', syscall: 'open', path: '.env' } { [Error: ENOENT: no such file or directory, open '.env'] errno: -2, code: 'ENOENT', syscall: 'open', path: '.env' } { [Error: ENOENT: no such file or directory, open '.env'] errno: -2, code: 'ENOENT', syscall: 'open', path: '.env' } { [Error: ENOENT: no such file or directory, open '.env'] errno: -2, code: 'ENOENT', syscall: 'open', path: '.env' } { [Error: ENOENT: no such file or directory, open '.env'] errno: -2, code: 'ENOENT', syscall: 'open', path: '.env' } { [Error: ENOENT: no such file or directory, open '.env'] errno: -2, code: 'ENOENT', syscall: 'open', path: '.env' } { [Error: ENOENT: no such file or directory, open '.env'] errno: -2, code: 'ENOENT', syscall: 'open', path: '.env' } { [Error: ENOENT: no such file or directory, open '.env'] errno: -2, code: 'ENOENT', syscall: 'open', path: '.env' } [Nodal.Daemon] Startup: Initializing [Nodal.Daemon] Startup: Initializing [Nodal.Daemon] Shutdown: Exited with code 1 /Users/tbrady/Development/nodalTest/my-nodal-project/node_modules/nodal/core/required/daemon.js:65 let child = cluster.fork(); ^

    TypeError: cluster.fork is not a function at Daemon.start (/Users/tbrady/Development/nodalTest/my-nodal-project/node_modules/nodal/core/required/daemon.js:65:29) at /Users/tbrady/Development/nodalTest/my-nodal-project/server.js:9:10 at Object. (/Users/tbrady/Development/nodalTest/my-nodal-project/server.js:15:3) at Module._compile (module.js:398:26) at Object.Module._extensions..js (module.js:405:10) at Module.load (module.js:344:32) at Function.Module._load (module.js:301:12) at Function.Module.runMain (module.js:430:10) at startup (node.js:141:18) at node.js:980:3 [Nodal.Daemon] Shutdown: Exited with code 1 [Nodal.Daemon] Startup: Initializing /Users/tbrady/Development/nodalTest/my-nodal-project/node_modules/nodal/core/required/daemon.js:65 let child = cluster.fork(); ^

    TypeError: cluster.fork is not a function at Daemon.start (/Users/tbrady/Development/nodalTest/my-nodal-project/node_modules/nodal/core/required/daemon.js:65:29) at /Users/tbrady/Development/nodalTest/my-nodal-project/server.js:9:10 at Object. (/Users/tbrady/Development/nodalTest/my-nodal-project/server.js:15:3) at Module._compile (module.js:398:26) at Object.Module._extensions..js (module.js:405:10) at Module.load (module.js:344:32) at Function.Module._load (module.js:301:12) at Function.Module.runMain (module.js:430:10) at startup (node.js:141:18) at node.js:980:3 [Nodal.Daemon] Startup: Initializing [Nodal.Daemon] Shutdown: Exited with code 1 /Users/tbrady/Development/nodalTest/my-nodal-project/node_modules/nodal/core/required/daemon.js:65 let child = cluster.fork(); ^

    TypeError: cluster.fork is not a function at Daemon.start (/Users/tbrady/Development/nodalTest/my-nodal-project/node_modules/nodal/core/required/daemon.js:65:29) at /Users/tbrady/Development/nodalTest/my-nodal-project/server.js:9:10 at Object. (/Users/tbrady/Development/nodalTest/my-nodal-project/server.js:15:3) at Module._compile (module.js:398:26) at Object.Module._extensions..js (module.js:405:10) at Module.load (module.js:344:32) at Function.Module._load (module.js:301:12) at Function.Module.runMain (module.js:430:10) at startup (node.js:141:18) at node.js:980:3 [Nodal.Daemon] Shutdown: Exited with code 1 [Nodal.Daemon] Startup: Initializing /Users/tbrady/Development/nodalTest/my-nodal-project/node_modules/nodal/core/required/daemon.js:65 let child = cluster.fork(); ^

    TypeError: cluster.fork is not a function at Daemon.start (/Users/tbrady/Development/nodalTest/my-nodal-project/node_modules/nodal/core/required/daemon.js:65:29) at /Users/tbrady/Development/nodalTest/my-nodal-project/server.js:9:10 at Object. (/Users/tbrady/Development/nodalTest/my-nodal-project/server.js:15:3) at Module._compile (module.js:398:26) at Object.Module._extensions..js (module.js:405:10) at Module.load (module.js:344:32) at Function.Module._load (module.js:301:12) at Function.Module.runMain (module.js:430:10) at startup (node.js:141:18) at node.js:980:3 [Nodal.Daemon] Startup: Initializing [Nodal.Daemon] Startup: Initializing [Nodal.Daemon] Shutdown: Exited with code 1 [Nodal.Daemon] Shutdown: Exited with code 1 [Nodal.Daemon] Shutdown: Exited with code 1 /Users/tbrady/Development/nodalTest/my-nodal-project/node_modules/nodal/core/required/daemon.js:65 let child = cluster.fork(); ^

    TypeError: cluster.fork is not a function at Daemon.start (/Users/tbrady/Development/nodalTest/my-nodal-project/node_modules/nodal/core/required/daemon.js:65:29) at /Users/tbrady/Development/nodalTest/my-nodal-project/server.js:9:10 at Object. (/Users/tbrady/Development/nodalTest/my-nodal-project/server.js:15:3) at Module._compile (module.js:398:26) at Object.Module._extensions..js (module.js:405:10) at Module.load (module.js:344:32) at Function.Module._load (module.js:301:12) at Function.Module.runMain (module.js:430:10) at startup (node.js:141:18) at node.js:980:3 /Users/tbrady/Development/nodalTest/my-nodal-project/node_modules/nodal/core/required/daemon.js:65 let child = cluster.fork(); ^

    TypeError: cluster.fork is not a function at Daemon.start (/Users/tbrady/Development/nodalTest/my-nodal-project/node_modules/nodal/core/required/daemon.js:65:29) at /Users/tbrady/Development/nodalTest/my-nodal-project/server.js:9:10 at Object. (/Users/tbrady/Development/nodalTest/my-nodal-project/server.js:15:3) at Module._compile (module.js:398:26) at Object.Module._extensions..js (module.js:405:10) at Module.load (module.js:344:32) at Function.Module._load (module.js:301:12) at Function.Module.runMain (module.js:430:10) at startup (node.js:141:18) at node.js:980:3 /Users/tbrady/Development/nodalTest/my-nodal-project/node_modules/nodal/core/required/daemon.js:65 let child = cluster.fork(); ^

    TypeError: cluster.fork is not a function at Daemon.start (/Users/tbrady/Development/nodalTest/my-nodal-project/node_modules/nodal/core/required/daemon.js:65:29) at /Users/tbrady/Development/nodalTest/my-nodal-project/server.js:9:10 at Object. (/Users/tbrady/Development/nodalTest/my-nodal-project/server.js:15:3) at Module._compile (module.js:398:26) at Object.Module._extensions..js (module.js:405:10) at Module.load (module.js:344:32) at Function.Module._load (module.js:301:12) at Function.Module.runMain (module.js:430:10) at startup (node.js:141:18) at node.js:980:3 [Nodal.Daemon] Startup: Initializing [Nodal.Daemon] Shutdown: Exited with code 1 /Users/tbrady/Development/nodalTest/my-nodal-project/node_modules/nodal/core/required/daemon.js:65 let child = cluster.fork(); ^

    TypeError: cluster.fork is not a function at Daemon.start (/Users/tbrady/Development/nodalTest/my-nodal-project/node_modules/nodal/core/required/daemon.js:65:29) at /Users/tbrady/Development/nodalTest/my-nodal-project/server.js:9:10 at Object. (/Users/tbrady/Development/nodalTest/my-nodal-project/server.js:15:3) at Module._compile (module.js:398:26) at Object.Module._extensions..js (module.js:405:10) at Module.load (module.js:344:32) at Function.Module._load (module.js:301:12) at Function.Module.runMain (module.js:430:10) at startup (node.js:141:18) at node.js:980:3 [Nodal.Daemon] Idle: Unable to spawn HTTP Workers, listening on port function (app) {

    app.listen(Nodal.my.Config.secrets.port);
    

    } [Nodal.Daemon] Shutdown: Exited with code 1 /Users/tbrady/Development/nodalTest/my-nodal-project/server.js:11 app.listen(Nodal.my.Config.secrets.port); ^

    TypeError: Cannot read property 'listen' of undefined at Server. (/Users/tbrady/Development/nodalTest/my-nodal-project/server.js:11:8) at Server.g (events.js:260:16) at emitNone (events.js:67:13) at Server.emit (events.js:166:7) at emitListeningNT (net.js:1263:10) at nextTickCallbackWith1Arg (node.js:444:9) at process._tickCallback (node.js:366:17)

    npm ERR! Darwin 15.3.0 npm ERR! argv "/usr/local/Cellar/node/5.3.0/bin/node" "/usr/local/bin/npm" "start" npm ERR! node v5.3.0 npm ERR! npm v3.3.12 npm ERR! code ELIFECYCLE npm ERR! [email protected] start: node server.js --harmony_classes npm ERR! Exit status 1 npm ERR! npm ERR! Failed at the [email protected] start script 'node server.js --harmony_classes'. npm ERR! Make sure you have the latest version of node.js and npm installed. npm ERR! If you do, this is most likely a problem with the my-nodal-project package, npm ERR! not with npm itself. npm ERR! Tell the author that this fails on your system: npm ERR! node server.js --harmony_classes npm ERR! You can get their info via: npm ERR! npm owner ls my-nodal-project npm ERR! There is likely additional logging output above.

    npm ERR! Please include the following file with any support request: npm ERR! /Users/tbrady/Development/nodalTest/my-nodal-project/npm-debug.log

    opened by thomasqbrady 10
  • Proposal: find_by for models

    Proposal: find_by for models

    Creating an issue for discussion, mentioned in the chat before but I think it has scrolled off.

    This is a proposal for a find_by method to be added to the model.js to simplify fetching a model by a non id key. I am not trying to propose a proliferation of find_by_X at all, just a simplification.

    As a example, using part 3 of the video the AccessToken#login has the following

    User.query()
        .where({username: params.body.data.username})
        .end(....)
    

    I am proposing a shorthand

    User.find_by({username: params.body.data.username}, (err, models) => {
    });
    

    And yeah upfront it adds no benefit other than a simplified api (and does not return a composer)..

    Rough single key only test impl https://gist.github.com/intabulas/0f1a529ecb255d7a4952

    opened by intabulas 10
  • CLI Refactoring

    CLI Refactoring

    I am opening this ticket as a place for discussion around refactoring the CLI portions of nodal based in part on @keithwhor comment in #50

    While there are issue for smaller fixes now (like #50) this is to share and discuss direction and decisions on how a CLI refresh she be acomplished.

    cc: @schahriar

    enhancement 
    opened by intabulas 10
  • Invalid column name errors

    Invalid column name errors

    This PR will make the composer throw errors if a query tries to use invalid column names.

    Reasoning

    Queries currently ignore invalid column names which makes it easy to write queries that break unexpectedly. This can lead to errors such as when a 'where' clause returns more records than it should. This change will ensure the developer is aware of a bad query and fix the issue.

    Example

    • A model has fields like author_id and is_admin
    • The developer writes a query like Model.query().where({ user_id: user.id, is_admin: false }).destroyAll(...)
    • The developer made an easy mistake and used the column user_id. This doesn't exist on the model so Nodal silently ignores it. This query then selects and deletes all users by accident.
    • This PR will fix issues like this by making a query like this throw an error to ensure this is never pushed to a deployed environment.
    opened by kangabru 0
  • Db:migrate is ommiting one caracter in the table name for FK relations

    Db:migrate is ommiting one caracter in the table name for FK relations

    Database Error: column "tipoflore_id" referenced in foreign key constraint does not exist

    The FK table name is "tipoflores" but the migrate command always ommit the last character in the table name, causing error

    image

    opened by papablopo 0
  • Generate int[] column type?

    Generate int[] column type?

    Hello,

    After reading the code, it seems we can't create any array type with the migration tool. Am I missing something?

    Ex: nodal g:model Tweet shared_with:int[]

    opened by chainlist 1
  • cross-spawn-async deprecated

    cross-spawn-async deprecated

    This module is deprecated, use cross-spawn instead which no longer requires a build toolchain.

    https://www.npmjs.com/package/cross-spawn-async

    npm WARN deprecated [email protected]: cross-spawn no longer requires a build toolchain, use it instead!

    opened by mpicard 0
Owner
Keith Horwood
Founder at @stdlib. Making developers' lives easier one repo at a time.
Keith Horwood
🍔 A Node.js Serverless Framework for front-end/full-stack developers. Build the application for next decade. Works on AWS, Alibaba Cloud, Tencent Cloud and traditional VM/Container. Super easy integrate with React and Vue. 🌈

Midway - 一个面向未来的云端一体 Node.js 框架 English | 简体中文 ?? 欢迎观看 Midway Serverless 2.0 发布会回放: https://www.bilibili.com/video/BV17A411T7Md 《Midway Serverless 发布

Midway.js 6.3k Jan 8, 2023
LoopBack makes it easy to build modern API applications that require complex integrations.

LoopBack makes it easy to build modern applications that require complex integrations. Fast, small, powerful, extensible core Generate real APIs with

StrongLoop and IBM API Connect 4.4k Jan 4, 2023
A serverless web framework for Node.js on AWS (CloudFormation, CloudFront, API Gateway, Lambda)

---- Sorry, this project is not maintained anymore. ---- dawson is a serverless web framework for Node.js on AWS (CloudFormation, CloudFront, API Gate

dawson 717 Dec 30, 2022
A Node.js express middleware that implements API versioning for route controllers

express-version-route This npm package provides an ExpressJS middleware to load route controllers based on api versions. Implementing API Versioning i

Liran Tal 87 Nov 15, 2022
Easily add filtering, sorting, and pagination to your Node.js REST API through your old friend: the query string!

QueryQL QueryQL makes it easy to add filtering, sorting, and pagination to your Node.js REST API through your old friend: the query string! Read our i

Truepic 99 Dec 27, 2022
Cross-platform project template using Electron and Angular with the Phaser game engine. Project has Flexbox integrated for easy and responsive organization of components around the Phaser canvas.

Coher3nTS Project This is an Angular project template with Phaser nested inside, set up to run with Electron. Cross-Platform & Responsive The template

Tim B 18 Dec 17, 2022
Fast, unopinionated, minimalist web framework for node.

Fast, unopinionated, minimalist web framework for node. const express = require('express') const app = express() app.get('/', function (req, res) {

null 59.5k Jan 5, 2023
A progressive Node.js framework for building efficient, scalable, and enterprise-grade server-side applications on top of TypeScript & JavaScript (ES6, ES7, ES8) 🚀

A progressive Node.js framework for building efficient and scalable server-side applications. Description Nest is a framework for building efficient,

nestjs 53.2k Dec 31, 2022
Expressive middleware for node.js using ES2017 async functions

Expressive HTTP middleware framework for node.js to make web applications and APIs more enjoyable to write. Koa's middleware stack flows in a stack-li

Koa.js 33.5k Jan 4, 2023
Realtime MVC Framework for Node.js

Website Get Started Docs News Submit Issue Sails.js is a web framework that makes it easy to build custom, enterprise-grade Node.js apps. It is design

Balderdash 22.4k Dec 31, 2022
🥚 Born to build better enterprise frameworks and apps with Node.js & Koa

Features Built-in Process Management Plugin System Framework Customization Lots of plugins Quickstart Follow the commands listed below. $ mkdir showca

egg 18.3k Dec 29, 2022
Fast and low overhead web framework, for Node.js

An efficient server implies a lower cost of the infrastructure, a better responsiveness under load and happy users. How can you efficiently handle the

Fastify 26k Jan 2, 2023
📦🔐A lightweight private proxy registry build in Node.js

Version 6 (Development branch) Looking for Verdaccio 5? Check branch 5.x. Verdaccio is a simple, zero-config-required local private npm registry. No n

Verdaccio 14.3k Dec 31, 2022
The future of Node.js REST development

restify is a framework, utilizing connect style middleware for building REST APIs. For full details, see http://restify.com Follow restify on Usage Se

restify 10.6k Jan 2, 2023
🚀 The Node.js Framework highly focused on developer ergonomics, stability and confidence

Sponsored by FOSS United is a non-profit foundation that aims at promoting and strengthening the Free and Open Source Software (FOSS) ecosystem in Ind

AdonisJS Framework 13.4k Dec 31, 2022
Use full ES2015+ features to develop Node.js applications, Support TypeScript.

ThinkJS Use full ES2015+ features to develop Node.js applications, Support TypeScript. 简体中文文档 Installation npm install -g think-cli Create Application

ThinkJS 5.3k Dec 30, 2022
:rocket: Progressive microservices framework for Node.js

Moleculer Moleculer is a fast, modern and powerful microservices framework for Node.js. It helps you to build efficient, reliable & scalable services.

MoleculerJS 5.5k Jan 4, 2023
Node.js framework

Node.js framework Total.js framework is a framework for Node.js platfrom written in pure JavaScript similar to PHP's Laravel or Python's Django or ASP

Total.js 4.2k Jan 2, 2023
A microservices toolkit for Node.js.

A Node.js toolkit for Microservice architectures This open source module is sponsored and supported by Voxgig. seneca Lead Maintainer: Richard Rodger

Seneca Microservices Framework 3.9k Dec 19, 2022