I’m building a Koa.js server and need to connect to MongoDB to store and retrieve data. Here is how to do it with some simple steps:

Step 1: Connect the database before Koa app initialised

    const initDB = require('./database');


    const app = new Koa();

Inside the database.js, import mongoose. You will need to npm install -save mongoose as well. It is an Object Data Modeling (ODM) library.

    const mongoose = require('mongoose');

    import { connexionString } from './conf/app-config';

    const initDB = () => {

      mongoose.connection.once('open', () => {
        console.log('connected to database');

      mongoose.connection.on('error', console.error);

    module.exports = initDB;

And the create the config of your connection string:

    export const connexionString = 'mongodb+srv://'+secret.mongodb.username+':'+secret.mongodb.password+'@xxxxxx.mongodb.net/test?retryWrites=true&w=majority';

You may run a local mongodb or you can use MongoDB Altas and run it on AWS cloud. Then you would get the connection string to put inside your config file.

Step 2: Create a schema in Koa

For example, we create a user schema inside /models/users.js

    const mongoose = require('mongoose');
    const Schema = mongoose.Schema;

    const UserSchema = new Schema({
      username: String,
      email: String,
      picture: String });

    module.exports = mongoose.model('User', UserSchema);

Step 3: Create a service to query the data

For example, we have a /service/user.service.js

    import User from '../models/users';

    export const getUserFromDb = async (username) => {
      const data = await User.findOne({username: username})
      return data;

    export const createUserInDb = async (user) => {
      var newUser = new User(user);
    return user; }

Step 4: Call the service in Koa controller

For example, we have a /controller/user.controller.js

    import { getUserFromDb } from '../service/user.service';
    import { createUserInDb } from '../service/user.service';

    static async getUser(ctx) {
      const user = await getUserFromDb(ctx.query.username);
      ctx.body = user;

    static async registerUser(ctx) {
      const user = await createUserInDb(ctx.request.body);
      ctx.body = user;

Finally, you can register the route using the controller and you can see the data being stored in the database. Let me know if you have any questions.