What is the Express.js of Deno?

Nick Scialli May 23, 2020🚀 3 minute read

If you're enjoying this blog, please consider one or both of the following:

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 software engineer at the U.S. Digital Service.

Subscribe to the mailing list!

If you like what I post here, please sign up to get updates and code insights in your inbox. I won't spam you and you can unsubscribe any time!

Powered by Buttondown.