What is the Express.js of Deno?

Nick Scialli
May 23, 2020

deno logo

As first adopters tinker with Deno, many people are trying to figure out tooling that parallels what they’re used to in node. If you’re looking for a lightweight web application framework like express.js, you probably want to explore oak.

See oak on github

Note: Many of the examples in this post are taken from the github documentation!

What is Oak?

Oak is self-described as “A middleware framework for Deno’s http server, including a router middleware.”

To be completely transparent, oak is actually much more similar to koa for node than express.js, but express users should be very comfortable with oak.

Creating a Hello World App with Oak

To create a “Hello World!” app in deno with oak, we import Application from the oak module. You create a new instance of the app, add a handler for all requests that set the response body to "Hello World!", and then listen on a port.

Make sure to pin down the version of oak in your import statement! Here it’s pinned down to version 4.0.0.

import { Application } from 'https://deno.land/x/oak@v4.0.0/mod.ts';

const app = new Application();

app.use((ctx) => {
  ctx.response.body = 'Hello World!';

await app.listen({ port: 8000 });

Now if you browse to http://localhost:8000, you should see our Hello world! message!

Adding Routes

Oak includes a router as well! Simply import the Router, create a new instance of it, specify your routes, and then make sure to add it as middleware to your app.

import { Application, Router } from 'https://deno.land/x/oak/mod.ts';

const books = new Map<string, any>();
books.set('1', {
  id: '1',
  title: 'The Hound of the Baskervilles',
  author: 'Conan Doyle, Author',

const router = new Router();
  .get('/', (context) => {
    context.response.body = 'Hello world!';
  .get('/book', (context) => {
    context.response.body = Array.from(books.values());
  .get('/book/:id', (context) => {
    if (context.params && context.params.id && books.has(context.params.id)) {
      context.response.body = books.get(context.params.id);

const app = new Application();

await app.listen({ port: 8000 });

Note the helpful router.allowedMethods() middleware, which will let clients know when a route is not allowed!


This should hopefully get you underway! There is much more functionality available in oak, but now that you know the solution to persue and have had a basic primer, you should be able to go from here.

Nick Scialli

Nick Scialli is a senior UI engineer at Microsoft.

© 2024 Nick Scialli