node.js angular jade client and node.js rest api

Are there any good examples or guidance anyone can provide for structuring an app like this?

Client (client.company.com)
  Node.js
  Angular
  Jade
  ExpressJS

Server (private) (server.company.com)
  node.js
  "rest" api (express)

The api is private right now, only accessible from the hosted servers.

If there is a page which creates recipes for example, is this right? client

- angular form with router that posts to client.company.com/recipe
- express would need route to handle that /recipe
- that route would then post to api server server.company.com/recipe
- then response would be propagated through the layers back to the ui.

Is that right having the client duplicate the api routes? Is there anything that can be done to simplify and make things with less duplication?

angular forms should just post directly to the api server. Express is used just to serve the angular html/javascript/static files. The less layers in between the html and api the better. I don't see any good reasons why you need the client to duplicate the api routes.

Since your api is behind the hosted server, you can setup nginx server to routes all your api calls from the hosted server to the api server. The below is a sample nginx configuration to do the routing:

upstream clientServer {
    server client.company.com:80;
}

upstream apiServer {
    server server.company.com:80;
}

server {

     location / {
        root   html;
        index  index.html index.htm;
        proxy_pass                  http://clientServer;
        proxy_set_header            Host            $host;
        proxy_set_header            X-Real-IP       $remote_addr;
        proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location /api {
        proxy_pass                  http://apiServer;
        proxy_set_header            Host            $host;
        proxy_set_header            X-Real-IP       $remote_addr;
        proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;
    }

Note the above is a snippet of the nginx.conf.

Nginx will look at your URL path.

  • requests accessing / path will go to client server (where you can host express js and angular files)
  • requests accessing /api/* path will be forwarded to the apiserver

Your angular form can then call the api directly to /api/*

Hope that helps.