This is with Node :

// app.js
const express = require('express')
const todosRoutes = require("./routes/todo")
const bodyParser = require("body-parser")

const app = express()

app.use(bodyParser.json())
app.use(todosRoutes)

app.listen(3000)
// todos.js
const express = require('express')
const router = express.Router()

let todos = [];

router.get("/todos", (req, res, next) => {
    res.json({ todos: todos })
})

router.post("/todos", (req, res, next) => {
    const newTodo = {
        id: new Date().toUTCString(),
        text: req.body.text
    }
    todos.push(newTodo);
    res.status(201).json({ message: "Todo created", todos: todos })
})

router.put("/todo/:todoId", (req, res, next) => {
    const todoId = req.params.todoId
    const todoIndex = todos.findIndex((todoItem) => {
        return todoItem.id === todoId
    })
    todos[todoIndex] = { ...todos[todoIndex], text: req.body.text }
    res.status(200).json({ message: 'Todo updated', todos: todos })
})

router.delete("/todo/:todoId", (req, res, next) => {
    todos = todos.filter((todoItem) => {
        todoItem.id !== req.params.todoId
    })
    res.status(200).json({ message: 'Deleted', todos: todos })
})

module.exports = router;

This is with Deno :

//app.ts
import { Application } from "<https://deno.land/x/oak/mod.ts>";
import todosRoutes from "./routes/todos.ts";

const app = new Application();

app.use(todosRoutes.routes())
app.use(todosRoutes.allowedMethods())

await app.listen({ port: 3000 });
// todos.ts
import { Router } from "<https://deno.land/x/oak/mod.ts>";

const router = new Router()

interface Todo {
    id: string;
    text: string;
}

let todos: Todo[] = [];

router.get('/todos', (ctx) => {
// no need to say it's JSON
    ctx.response.body = { todos: todos }
})

router.post('/todos', async (ctx) => {
// must await for the data
    const data = await ctx.request.body()
    const newTodo: Todo = {
        id: new Date().toUTCString(),
// here we have to select data.value
        text: data.value
    }
    todos.push(newTodo)
    ctx.response.body = { message: "Created todo!", todo: newTodo, todos: todos };
})

router.put('/todo/:todoId', async (ctx) => {
    const todoId = ctx.params.todoId
    const text = await ctx.request.body()
    const todoIndex = todos.findIndex((todoItem) => {
        return todoItem.id === todoId
    })
    todos[todoIndex] = { ...todos[todoIndex], text: text.value }
    ctx.response.body = { message: 'Todo updated', todos: todos }

})

router.delete('/todo/:todoId', (ctx) => {
    todos = todos.filter((todoItem) => {
        todoItem.id !== ctx.params.todoId
    })
    ctx.response.body = { message: 'Deleted', todos: todos }
})

export default router;