DEV Community

Cover image for Deploy Node API (Express Typescript) on Vercel
Tirth Patel
Tirth Patel

Posted on

 

Deploy Node API (Express Typescript) on Vercel

A couple of weeks back, I developed an API in Node based on Typescript. I tried to deploy it on Heroku.

But the process was long and time-consuming. Also, I noticed that Heroku is terminating free accounts from 28 Nov'22. ☹️

Heroku

So I tried to experiment with various other platforms to deploy my Typescript-based Node API. Amon them free, robust, and versatile platform I found is VERCEL. Based on my experience, here are a few simple steps which you can follow and easily deploy Typescript-based Node API on Vercel. πŸš€


1) Express + Typescript Boilerplate App ✏️

Create express project with typescript. You can follow the below-mentioned steps to make a boilerplate for the project. (Github repo link is provided at end of article)

  • Initialize node project


    npm init -y
    
  • Install packages (you can use npm/yarn/pnpm)


    yarn add express
    yarn add -D typescript
    yarn add -D @types/node
    yarn add -D @types/express
    yarn add -D nodemon
    yarn add -D ts-node
    
  • Create tsconfig.json
    To work with typescript we need to make tsconfig.json file which will help to compile and build Typescript files in plain JS. Execute below command


    npx tsc --init --rootDir src --outDir build --esModuleInterop --resolveJsonModule --lib es6 --module commonjs --allowJs true --noImplicitAny true
    



Once the file is created you can keep it as is, or cleanup non necessary stuff. Replace content of tsconfig.json with following :


    {
    "compilerOptions": {
        "module": "commonjs",
        "esModuleInterop": true,
        "allowSyntheticDefaultImports": true,
        "target": "es6",
        "noImplicitAny": true,
        "moduleResolution": "node",
        "sourceMap": true,
        "outDir": "dist",
        "baseUrl": ".",
        "paths": {
            "*": ["node_modules/*", "src/types/*"]
        }
    },
    "include": ["./src/**/*"]
    }
Enter fullscreen mode Exit fullscreen mode
  • Update scripts in package.json


    "start": "nodemon src/index.ts",
    
  • Write express server code : Create file : src/index.ts and paste following code in it
  import express, { Request, Response } from 'express'

  const app = express()
  const port = process.env.PORT || 8080

  app.get('/', (_req: Request, res: Response) => {
    return res.send('Express Typescript on Vercel')
  })

  app.get('/ping', (_req: Request, res: Response) => {
    return res.send('pong πŸ“')
  })

  app.listen(port, () => {
    return console.log(`Server is listening on ${port}`)
  })
Enter fullscreen mode Exit fullscreen mode
  • Spin up server : Run yarn start or npm run start command in terminal to start express serve. You can open browser and go to localhost:8080. API will return response of Express Typescript on Vercel.

2) Initialize git in our project. πŸ“₯

  • Make a .gitignore file in the root of the folder. And add node_modules to it. If .gitignore file exists check that node_modules is added into it.
  • Execute git init in the terminal (from root of project) or you can use VS Code's source control tab to initialize git repository.
  • Connect local repo to remote (github/bitbucket). You can use any of the version control system to publish your repository.

3) Create Vercel project πŸ—ƒοΈ

  • Go to vercel.com -> Login
  • Login using the Version control platform you have kept your repository.
  • From the dashboard -> Add new project -> Select your repository -> Deploy

  • Afer deployment you will see something similar to this! 😟

Vercel Error
(ERROR 🚨)

  • Don't worry... Just follow on steps to fix it. πŸ‘

4) Add Vercel config in app βš™οΈ

  • In the above step, after your fist deploy is completed, you can see that we're not getting Express Typescript on Vercel response from API.
  • To work this as expected, we need to tell Vercel that is a API and you need to serve this as a serverless function.
  • For this, simply we need to add vercel.json file in root of our project. Paste below code in file.
{
    "version": 2,
    "builds": [
        {
            "src": "dist/index.js",
            "use": "@vercel/node",
            "config": { "includeFiles": ["dist/**"] }
        }
    ],
    "routes": [
        {
            "src": "/(.*)",
            "dest": "dist/index.js"
        }
    ]
}
Enter fullscreen mode Exit fullscreen mode



NOTE: Check your tsconfig.json file. The value against outDir must be kept instead of dist. If your config file has any other value than dist, replace it at either of both places.


5) Add a pre-commit hook 🏷️

  • Vercel requires plain JS source files instead of Typescript. In order to do this, we need to build the project before committing and send compiled JS files so that Vercel can parse those files and serve the API.

  • Install pre-commit and rimraf package :


  yarn add -D pre-commit
  yarn add -D rimraf
Enter fullscreen mode Exit fullscreen mode
  • Modify scripts field in package.json file as follows:
  "scripts": {
  "start": "nodemon src/index.ts",
  "build": "rimraf dist && tsc",
  "ts.check": "tsc --project tsconfig.json",
  "add-build": "git add dist",
  "test": "echo \"Error: no test specified\" && exit 1"
  },
Enter fullscreen mode Exit fullscreen mode
  • Add new field pre-commit field in package.json :
  "pre-commit": [
      "ts.check",
      "build",
      "add-build"
  ]
Enter fullscreen mode Exit fullscreen mode
  • What this will do? β†’ Whenever you will commit, the commands written in pre-commit will be executed. It will check Typescript errors, build the project and add build folder to the staged changes. (If you opt for manual build, don't forget to run build command to start build.)

5) Re-Deploy and Re-Check API πŸ”

  • Commit the changes you have made and push the commit to GitHub. Check on vercel for the new deployment. Vercel will automatically trigger a new deployment on every push. Incase it is not started, you can manually start a deployment.

  • Once new deployment is live, you can copy the deploy URL and run in browser. You will see Express Typescript on Vercel as a API response. Hurrah πŸ˜ƒ

API working

  • To assure that API is working perfectly, you can also hit /ping route which will return pong πŸ“ as the response.

Ping Pong response

Closing comments πŸ™‹β€β™‚οΈ

  • Thank you for following steps with me. Incase you find any issue in above mentioned steps, please ping in comment.
  • Also a humble request you to write which topic you want in my next blog. I will include that in my target list. 🎯
  • Github repo link for this project : Express Typescript Code



Tirth Patel, signing off! 🫑

Top comments (7)

Collapse
 
soozav profile image
Luis Verteliz • Edited

Hi Tirth, I'v tried to follow your instructions but I can make my app work, I get the following error: "Due to builds existing in your configuration file, the Build and Development Settings defined in your Project Settings will not apply."

In my app url I get the following error: "This Serverless Function has crashed".

Would you take a look at my code please?
github.com/SoozaV/sinecta-maps-bac...

Regards!

Collapse
 
soozav profile image
Luis Verteliz

I think I found out the issue looking at my function logs:

Image description

Do you have any idea on how to solve this? I can't find a solution.

Regards.

Collapse
 
tirthpatel profile image
Tirth Patel

Or you can do one more thing, in the vercel project setting page you can override the build command. You can try this one: npm i -g pg && npm run vercel-build

This will first install pg package in your VM on cloud server. Then you can access it while calling API. Please try this as well. And let me know if it works.

Cheers :)

Collapse
 
tirthpatel profile image
Tirth Patel

Hi @soozav It seems there is some issue with pg package. I've found one resource that might help you. Please check this PG package issue

Collapse
 
uzzadev profile image
uzzadev

Hi Tirth!!
Today I was following your post, it's perfect and help me a lot, also is working very well, however I have a question/scenario...

Once that I deployed successfully but then I tried to add a config package from npm (npmjs.com/package/config), which I used to manage different environment variables (development, production for instance),
and then I deploy to Vercel, I get the same 404 NOT_FOUND error.

Since the npm config package require to add a folder in root project called "config" where can include the environments configurations files for each environment, I thinking the problem is something missing in vercel.json config file in order to include the compiled config ts files.

I would appreciate if you can help me with some clues about this error or help me to understand and fix it.

Regards!

Collapse
 
lucasvtiradentes profile image
Lucas Vieira

very useful thank you!

Collapse
 
pouriarezaeii profile image
Pouria Rezaei

Many thanks Tirth. I was stuck for 4 hours. Finally I found your post and Bingo!

11 Tips That Make You a Better Typescript Programmer

1 Think in {Set}

Type is an everyday concept to programmers, but it’s surprisingly difficult to define it succinctly. I find it helpful to use Set as a conceptual model instead.

#2 Understand declared type and narrowed type

One extremely powerful typescript feature is automatic type narrowing based on control flow. This means a variable has two types associated with it at any specific point of code location: a declaration type and a narrowed type.

#3 Use discriminated union instead of optional fields

...

Read the whole post now!