> ## Documentation Index
> Fetch the complete documentation index at: https://docs.webapp.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Node JS

1. [Setting up the Express Application](./node#setting-up-the-express-application)

2. [Layerfile](./node#layerfile)

3. [Setting up the Layerfile](./node#setting-up-the-layerfile)

4. [Adding the Layerfile](./node#adding-the-layerfile)

5. [Video Tutorial](./node#video-tutorial)

6. [Project Source Code](https://github.com/joshuadsouza/webappio-docs-examples/tree/master/webapp-express)

## Setting up the Express Application

**(You can skip this section if you already have an Express app running.)**

To build your Express application, ensure you have both node and npm installed.
You can verify with the following commands: `node --version` `npm --version`. If
installed correctly these steps will both give you a number as the terminal
output.

If `node` and `npm` are installed, create a new directory with
`mkdir [app_name]` - replacing `[app_name]` with the name of your application.
Next navigate into the directory with `cd [app_name]` and run the following
commands:

1. `npm init`

2. `npm install express`

After installing express, create a new file called `app.js` at the root of the
folder and use the following to set up an endpoint for your application:

```javascript app.js theme={null}
const express = require("express");
const app = express();
const port = 3000;

app.get("/", (req, res) => {
  res.send("Hello World");
});

app.get("/test", (req, res) => {
  res.send("Test Route!");
});

app.listen(port, () => {
  console.log(`Example app listening on port ${port}`);
});
```

After you create the `app.js` file, you can run the Express application with the
following command:

`node app.js`

You should now see your app running at
[https://localhost:3000](https://localhost:3000).

### Summary of Steps:

1. `node --version`

2. `npm --version`

3. `mkdir [app_name]`

4. `cd [app_name]`

5. Create your `app.js` file with the content above

6. `node app.js`

## Layerfile

Listed below is an example Layerfile for webapp.io which you can use to setup a
basic Express JS application. We'll breakdown this Layerfile in the section
below for a set of detailed explanation on what each one of the instructions do.

```docker Layerfile theme={null}
FROM vm/ubuntu:18.04

RUN curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash -
RUN sudo apt-get install -y nodejs
RUN sudo npm install npm@latest -g


COPY . .
RUN npm install
RUN BACKGROUND node app.js
EXPOSE WEBSITE http://localhost:3000
```

## Setting up the Layerfile

If you haven't already, please sign up to [webapp.io](/sign-up), and install
webapp.io onto your repository.

First let's breakdown each instruction in our Layerfile.

### 1: Set the Image

### `FROM vm/ubuntu:18.04`

The `FROM` [instruction](../layerfile-reference/from) tells webapp.io what base
to use to run tests from. There can only be one `FROM` line, and in this case
we're using the `ubuntu:18.04` virtual machine image.

If you're familiar with AWS Ec2 Instances, this is similar to creating a virtual
machine from the ubuntu 18.04 image.

### 2. Install NodeJS and NPM

### `RUN curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash -`

### `RUN sudo apt-get install -y nodejs`

### `RUN sudo npm install npm@latest -g`

The `RUN` [instruction](../layerfile-reference/run) will run the given script,
and fails the Layerfile if the script fails. In this case, we're using the `RUN`
command to install the dependencies we need to build and run the Express
application.

In this case we're using the `RUN` instruction to download Node JS and npm.

### 3. Get Repository Files

### `COPY . .`

The `COPY`[instruction](../layerfile-reference/copy) moves files from your
repository to the virtual machine. The Layerfile will pick up on the files in
the repository that you are making the commit for, and will copy those files
into the virtual machine so you can run you project.

### 4. Install Dependencies

### `RUN npm install`

Similar to the `RUN` commands above, this will execute the given script
`npm install`, which will install the dependencies for the Express app.

### 5. Start the Express App

### `RUN BACKGROUND node app.js`

The `RUN BACKGROUND`[instruction](../layerfile-reference/run) is the `RUN`
instruction with the `BACKGROUND` flag. This tells webapp.io to continue to the
next step in the Layerfile instead of waiting for the given script to run. The
reason why we do this is that `node app.js` will essentially block the terminal
while the Express app is running. We want to continue to the next step so that's
why we use `RUN BACKGROUND` here.

### 6. Expose Express App on the Virtual Machine

### `EXPOSE WEBSITE http://localhost:3000`

The `EXPOSE WEBSITE`[instruction](../layerfile-reference/expose-website)
instruction creates a link to view the virtual machine at a specific port. We
use `EXPOSE WEBSITE` to expose the virtual machine on port 3000 which is where
the Express application runs after running `node app.s`. We use `EXPOSE WEBSITE`
here so we can get a link to our Express JS app to share with stakeholders
involved in our projects.

## Adding the Layerfile

The last step in this process is to add the Layerfile to your repository. Simply
create a file called `Layerfile` (no file extension) in the root of your Express
JS application. If you haven't already, install webapp.io onto your repository
containing your Express JS app. Once done, simply create a commit and push your
Express app to the repository with the new Layerfile. Webapp.io will pick up on
the Layerfile and build your Express JS application according to the steps in
your Layerfile.

## Video Tutorial

Check out our Express JS video tutorial before for a step-by-step breakdown on
how to set up webapp.io with preview environments for an Express JS application:

<iframe src="https://www.youtube.com/embed/nM1P0f4WQ8k" title="webapp.io Node JS Example" frameborder="0" class="w-full h-96" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; fullscreen;" />

### [View Project Source Code](https://github.com/joshuadsouza/webappio-docs-examples/tree/master/webapp-express)
