In this chapter, we created a complete web-based CRUD application. It consists of a Node.js backend and an AngularJS frontend, connected through a RESTful web service API. We learned how to create a continuous delivery environment where end-to-end specs provide a tests suite that verifies the correctness of the web service API and a migrations setup ensures that database schema and code are in sync. The application can be run in the context of different configuration environments, allowing to keep test, dev, and production data separated.




















































