React Nx Tutorial - Step 5: Add Node Application Implementing API

The requests fail because the API has not been created yet. Using Nx you develop node applications next to your React applications. You can use same commands to run and test them. You share code between the backend and the frontend. Use this capability to implement the API service.

Add Express plugin to your workspace

Nx is an open platform with plugins for many modern tools and frameworks. To see some plugins, run npx nx list:

>  NX   Installed plugins:

  @nrwl/cypress (executors,generators)
  @nrwl/jest (executors,generators)
  @nrwl/linter (executors,generators)
  @nrwl/nx-cloud (generators)
  @nrwl/react (generators)
  @nrwl/storybook (executors,generators)
  @nrwl/web (executors,generators)
  @nrwl/workspace (executors,generators)


>  NX   Also available:

  @nrwl/angular (generators)
  @nrwl/express (executors,generators)
  @nrwl/nest (executors,generators)
  @nrwl/next (executors,generators)
  @nrwl/node (executors,generators)
  @nrwl/nx-plugin (executors,generators)


>  NX   Community plugins:

  nx-plugins - Nx plugin integrations with ESBuild / Vite / Snowpack / Prisma, with derived ESBuild / nowpack / ... plugins.
  @codebrew/nx-aws-cdk - An Nx plugin for aws cdk develop.
  ...

Add the dependency:

yarn add --dev @nrwl/express
List plugins

When installing @nrwl/express, it also automatically added @nrwl/node for you. Run npx nx list @nrwl/express and npx nx list @nrwl/node to see what those plugins provide.

Generate an Express application

Run the following to generate a new Express application:

npx nx g @nrwl/express:app api --frontendProject=todos

After this is done, you should see something like this:

myorg/
├── apps/
│   ├── api/
│   │   ├── src/
│   │   │   ├── app/
│   │   │   ├── assets/
│   │   │   ├── environments/
│   │   │   │   ├── environment.ts
│   │   │   │   └── environment.prod.ts
│   │   │   └── main.ts
│   │   ├── jest.config.ts
│   │   ├── project.json
│   │   ├── tsconfig.app.json
│   │   ├── tsconfig.json
│   │   └── tsconfig.spec.json
│   ├── todos/
│   │   ├── src/
│   │   ├── project.json
│   │   └── proxy.conf.json
│   └── todos-e2e/
├── libs/
├── tools/
├── nx.json
├── package.json
└── tsconfig.base.json

The apps directory is where Nx places anything you can run: frontend applications, backend applications, e2e test suites. That's why the api application appeared there.

You can run:

CommandDescription
npx nx serve apiserve the application
npx nx build apibuild the application
npx nx test apitest the application

Add a file apps/api/src/app/todos.ts.

1import { Express } from 'express';
2
3interface Todo {
4  title: string;
5}
6
7const todos: Todo[] = [{ title: 'Todo 1' }, { title: 'Todo 2' }];
8
9export function addTodoRoutes(app: Express) {
10  app.get('/api/todos', (req, resp) => resp.send(todos));
11  app.post('/api/addTodo', (req, resp) => {
12    const newTodo = {
13      title: `New todo ${Math.floor(Math.random() * 1000)}`,
14    };
15    todos.push(newTodo);
16    resp.send(newTodo);
17  });
18}
19

Here, you are building an Express application with Nx. Nx also comes with Next support, and you can also use any other node library you want.

Next update apps/api/src/main.ts to register the routes

1import * as express from 'express';
2import { addTodoRoutes } from './app/todos';
3
4const app = express();
5
6app.get('/api', (req, res) => {
7  res.send({ message: 'Welcome to api!' });
8});
9addTodoRoutes(app);
10
11const port = process.env.port || 3333;
12const server = app.listen(port, () => {
13  console.log(`Listening at http://localhost:${port}/api`);
14});
15server.on('error', console.error);
16

Now run npx nx serve api to run the api server

Refresh the application in the browser. The React app is now able to fetch and create todos by calling the API.

What's Next