# Why Choose the AdonisJs Framework? | Full-Stack Google Contacts Clone with AdonisJs (Node.js) and Quasar Framework (Vue.js)

**Author:** Ndianabasi Udonkang  
**Published:** 2021-09-30

In this lesson, we will look at the beautiful and expressive features of the AdonisJs Framework and why we chose it for our API server over others in Nodejs

---

## Tags

- [JavaScript](/llms/technical-blog/tag/javascript.md)
- [Nodejs](/llms/technical-blog/tag/nodejs.md)
- [Vuejs](/llms/technical-blog/tag/vuejs.md)
- [Adonisjs](/llms/technical-blog/tag/adonisjs.md)
- [Quasar Framework](/llms/technical-blog/tag/quasar-framework.md)

## Part of Series: [Full-Stack Google Contacts Clone with Node.js (Adonisjs Framework) and Vue.js (Quasar Framework)](/llms/technical-blog/series/clnwu9bc991hiu3wo2vwmw45/full-stack-google-contacts-clone-with-node-js-adonisjs-framework-and-vue-js-quasar-framework.md)

This article is part of the **[Full-Stack Google Contacts Clone with Node.js (Adonisjs Framework) and Vue.js (Quasar Framework)](/llms/technical-blog/series/clnwu9bc991hiu3wo2vwmw45/full-stack-google-contacts-clone-with-node-js-adonisjs-framework-and-vue-js-quasar-framework.md)** series.

### Articles in this Series:

- [Introduction to Full-Stack Google Contacts Clone with Node.js (Adonisjs Framework) and Vuejs (Quasar Framework)](/llms/technical-blog/article/xe5mlxg43s9rpx1pxsvfdp3r/introduction-to-full-stack-google-contacts-clone-with-node-js-adonisjs-framework-and-vuejs-quasar-framework.md)
- [Workspace Setup | Full-Stack Google Contacts Clone with Adonis.js/Node.js and Quasar (Vue.js)](/llms/technical-blog/article/fo8str8yjpkz5dygxg875bpw/workspace-setup-full-stack-google-contacts-clone-with-adonis-js-node-js-and-quasar-vue-js.md)
- [Frontend Overview | Full-Stack Google Contacts Clone with Adonis.js/Node.js and Quasar (Vue.js)](/llms/technical-blog/article/nxgmng6fhf1cwjk30coflro2/frontend-overview-full-stack-google-contacts-clone-with-adonis-js-node-js-and-quasar-vue-js.md)
- [The Left Drawer | Full-Stack Google Contacts Clone with Adonis.js/Node.js and Quasar (Vue.js)](/llms/technical-blog/article/m6fagvy2il5h65llxxbbl9os/the-left-drawer-full-stack-google-contacts-clone-with-adonis-js-node-js-and-quasar-vue-js.md)
- [Improve The Header | Full-Stack Google Contacts Clone with Adonis.js/Node.js and Quasar (Vue.js)](/llms/technical-blog/article/jjwbxcg450jmkkcrrmkmwvwj/improve-the-header-full-stack-google-contacts-clone-with-adonis-js-node-js-and-quasar-vue-js.md)
- [New Contact Form Design | Full-Stack Google Contacts Clone with Adonis.js/Node.js and Quasar (Vue.js)](/llms/technical-blog/article/ebguwpkntk3empakunrki4dq/new-contact-form-design-full-stack-google-contacts-clone-with-adonis-js-node-js-and-quasar-vue-js.md)
- [Validating the Contact Form with Vuelidate | Full-Stack Google Contacts Clone with Adonis.js/Node.js and Quasar (Vue.js)](/llms/technical-blog/article/z0xr9m2ljler2cwnpsw2ycwa/validating-the-contact-form-with-vuelidate-full-stack-google-contacts-clone-with-adonis-js-node-js-and-quasar-vue-js.md)
- [Designing the Contacts Table | Full-Stack Google Contacts Clone with Adonis.js/Node.js and Quasar (Vue.js)](/llms/technical-blog/article/h2p1x1z406ib38zu2dci3jur/designing-the-contacts-table-full-stack-google-contacts-clone-with-adonis-js-node-js-and-quasar-vue-js.md)
- [Designing the Contacts Table (Part 2) | Full-Stack Google Contacts Clone with Adonis.js/Node.js and Quasar (Vue.js)](/llms/technical-blog/article/j0iscua9gg8ekuz8ifh6chpn/designing-the-contacts-table-part-2-full-stack-google-contacts-clone-with-adonis-js-node-js-and-quasar-vue-js.md)
- [Refactoring the Main Layout | Full-Stack Google Contacts Clone with Adonis.js/Node.js and Quasar (Vue.js)](/llms/technical-blog/article/uktmlqsivwtr3cvnpld59k9q/refactoring-the-main-layout-full-stack-google-contacts-clone-with-adonis-js-node-js-and-quasar-vue-js.md)
- [Improving User Experience with the Contacts Table | Full-Stack Google Contacts Clone with Adonis.js/Node.js and Quasar (Vue.js)](/llms/technical-blog/article/dzs812auf61ej7qu2cg726dh/improving-user-experience-with-the-contacts-table-full-stack-google-contacts-clone-with-adonis-js-node-js-and-quasar-vue-js.md)
- [Designing the Contact Details Page | Full-Stack Google Contacts Clone with Adonis.js/Node.js and Quasar (Vue.js)](/llms/technical-blog/article/kf9pz97n63fvgfrcy5viwzrg/designing-the-contact-details-page-full-stack-google-contacts-clone-with-adonis-js-node-js-and-quasar-vue-js.md)
- [Creating the Contact Edit Page | Full-Stack Google Contacts Clone with Adonis.js/Node.js and Quasar (Vue.js)](/llms/technical-blog/article/fmr90prj84c9zn0633jc368g/creating-the-contact-edit-page-full-stack-google-contacts-clone-with-adonis-js-node-js-and-quasar-vue-js.md)
- [How Software Backends Work | Full-Stack Google Contacts Clone with AdonisJs (Node.js) and Quasar Framework (Vue.js)](/llms/technical-blog/article/aca8fcrghz70nn1wqg3uzbum/how-software-backends-work-full-stack-google-contacts-clone-with-adonis-js-node-js-and-quasar-framework-vue-js.md)
- [Setting Up The Backend | Full-Stack Google Contacts Clone with AdonisJs (Node.js) and Quasar Framework (Vue.js)](/llms/technical-blog/article/fxb49fmz9ljbwrimbnnzudfv/setting-up-the-backend-full-stack-google-contacts-clone-with-adonis-js-node-js-and-quasar-framework-vue-js.md)
- **Why Choose the AdonisJs Framework? | Full-Stack Google Contacts Clone with AdonisJs (Node.js) and Quasar Framework (Vue.js)** (Current Article)
- [Setting Up Our API Server with AdonisJs Framework | Full-Stack Google Contacts Clone with AdonisJs (Node.js) and Quasar Framework (Vue.js)](/llms/technical-blog/article/x1jgmet84aqj9qggu5mulkh0/setting-up-our-api-server-with-adonis-js-framework-full-stack-google-contacts-clone-with-adonis-js-node-js-and-quasar-framework-vue-js.md)
- [Setting Up Postman with the API Server | Full-Stack Google Contacts Clone with AdonisJS (Node.js) and Quasar Framework (Vue.js)](/llms/technical-blog/article/v4qehksislosmuy92qgjr4ct/setting-up-postman-with-the-api-server-full-stack-google-contacts-clone-with-adonis-js-node-js-and-quasar-framework-vue-js.md)
- [The Model-View-Controller Design Pattern in AdonisJS | Full-Stack Google Contacts Clone with AdonisJS (Node.js) and Quasar Framework (Vue.js)](/llms/technical-blog/article/h5wqql65iejop5xrplujw458/the-model-view-controller-design-pattern-in-adonis-js-full-stack-google-contacts-clone-with-adonis-js-node-js-and-quasar-framework-vue-js.md)
- [Create Column Definitions & Insert New Contacts | Full-Stack Google Contacts Clone with AdonisJS (Node.js) and Quasar Framework (Vue.js)](/llms/technical-blog/article/asc2emsho4u73r6jb2gxjddw/create-column-definitions-and-insert-new-contacts-full-stack-google-contacts-clone-with-adonis-js-node-js-and-quasar-framework-vue-js.md)
- [Data Validation & Sanitisation with AdonisJS | Full-Stack Google Contacts Clone with AdonisJS (Node.js) and Quasar Framework (Vue.js)](/llms/technical-blog/article/bcey0ac7m5sbs9hqy1h824sl/data-validation-and-sanitisation-with-adonis-js-full-stack-google-contacts-clone-with-adonis-js-node-js-and-quasar-framework-vue-js.md)
- [Creating a Middleware and Updating a Contact | Full-Stack Google Contacts Clone with AdonisJS (Node.js) and Quasar Framework (Vue.js)](/llms/technical-blog/article/oqxzmtgfy1r3oewpnedc7wf6/creating-a-middleware-and-updating-a-contact-full-stack-google-contacts-clone-with-adonis-js-node-js-and-quasar-framework-vue-js.md)
- [Fetching and Deleting a Contact with AdonisJS | Full-Stack Google Contacts Clone with AdonisJS Framework (Node.js) and Quasar Framework (Vue.js)](/llms/technical-blog/article/p6bh0ponq43u3vi6o8uww84x/fetching-and-deleting-a-contact-with-adonis-js-full-stack-google-contacts-clone-with-adonis-js-framework-node-js-and-quasar-framework-vue-js.md)
- [Using Model Factories and Seeders in AdonisJS | Full-Stack Google Contacts Clone with AdonisJS Framework (Node.js) and Quasar Framework (Vue.js)](/llms/technical-blog/article/cfotveuxbgjtdp12l6pzcb2y/using-model-factories-and-seeders-in-adonis-js-full-stack-google-contacts-clone-with-adonis-js-framework-node-js-and-quasar-framework-vue-js.md)
- [Creating and Registering a Vuex Module | Full-Stack Google Contacts Clone with AdonisJS Framework (Node.js) and Quasar Framework (Vue.js)](/llms/technical-blog/article/cw96ewnzujgsz2e2garhbuzb/creating-and-registering-a-vuex-module-full-stack-google-contacts-clone-with-adonis-js-framework-node-js-and-quasar-framework-vue-js.md)
- [Connecting UI Components to the Vuex Store | Full-Stack Google Contacts Clone with AdonisJS Framework (Node.js) and Quasar Framework (Vue.js)](/llms/technical-blog/article/fdyqp17yehbnqrjvjvab4b5b/connecting-ui-components-to-the-vuex-store-full-stack-google-contacts-clone-with-adonis-js-framework-node-js-and-quasar-framework-vue-js.md)
- [Connecting the Frontend to the API Server | Full-Stack Google Contacts Clone with AdonisJS Framework (Node.js) and Quasar Framework (Vue.js)](/llms/technical-blog/article/fk4262359gg3g7f0jn95fn9b/connecting-the-frontend-to-the-api-server-full-stack-google-contacts-clone-with-adonis-js-framework-node-js-and-quasar-framework-vue-js.md)
- [Creating and Updating Contacts From the Frontend | Full-Stack Google Contacts Clone with AdonisJS Framework (Node.js) and Quasar Framework (Vue.js)](/llms/technical-blog/article/t15w2s3ao9jo74l96stjo7z6/creating-and-updating-contacts-from-the-frontend-full-stack-google-contacts-clone-with-adonis-js-framework-node-js-and-quasar-framework-vue-js.md)
- [Uploading Files and Creating Avatars for Contacts With AdonisJS and Axios](/llms/technical-blog/article/hg9ilaubqesm8angg0rhrjp9/uploading-files-and-creating-avatars-for-contacts-with-adonis-js-and-axios.md)
- [Deleting a Contact with AdonisJS and Vuejs](/llms/technical-blog/article/zdr4pxmgcax2dsfnwimhty0g/deleting-a-contact-with-adonis-js-and-vuejs.md)

---

## Article Content

There are numerous `Node.js` frameworks which can be used to build API server for your application. So, why am I choosing the [AdonisJS framework](https://adonisjs.com/) for this series? The simple answer is that `AdonisJS` is amazing! I can see you roll your eyes at such a shallow answer but let me tell you a story.

Late 2018, I had finished learning JavaScript and PHP. I chose Laravel - which is now the defacto backend framework for PHP - as the framework to learn and get started on building full-stack applications. Along the way I got bored. Truth be told, I never really liked PHP that much. Then I got to know that I could use my JavaScript skills to build server-side applications through Node.js. It was one of the transformative information I got and literally accelerated my journey in web development. I began to search for Node.js framework which I could use. I came across popular ones such as `Express.js` and `Fastify.js` but something in me did not like them. I was already spoilt by the beauty and expressiveness of Laravel, so those frameworks did not tickle my fancy. So I decided to search for a Laravel-like framework for `Node.js`. Voila! I stumbled upon `AdonisJS`.

I might have stumbled on `AdonisJS` because I needed a framework like `Laravel` but that wasn't why I've pitched my tent with the framework for 3 year now. You see, `AdonisJS` was initially heavily inspired by Laravel (as admitted the founder and now my good friend - Harminder Virk), but along the way AdonisJS created its own persona, brand, and style which is still unrivalled in the Node.js ecosystem. AdonisJS adopted the same doctrine used in Ruby on Rails including `Convention over Configuration`. You can read more the `Principle of Convention over Configuration` from Rails' founder [here](https://rubyonrails.org/doctrine/#convention-over-configuration). You see `AdonisJS` introduced fluency and expressiveness into the `Node.js` ecosystem. Even if you are a non-programmer, you can read through the controller files of `AdonisJS` and totally understand what the programmer was trying to accomplish. It is that beautiful.

Look at an example from this query where a particular company is fetched with all its relations:

```ts
    const company = await Company.query()
        .where('id', requestedCompany.id)
        .preload('companySize', (query) => query.select('id', 'size'))
        .preload('country', (query) => query.select('id', 'name'))
        .preload('state', (query) => query.select('id', 'name'))
        .preload('companyLogo', (fileQuery) => fileQuery.select('formats', 'url'))
        .first()
```

Or this query where we want to create a new customer and associate it with a company automatically

```ts
const newCustomer = await requestedCompany?.related('customers').create({
      customerTitleId: title,
      firstName: first_name,
      lastName: last_name,
      middleName: middle_name,
      email,
      phoneNumber: phone_number,
      isCorporate: is_corporate,
      corporateHasRep: corporate_has_rep,
      companyName: company_name,
      companyPhone: company_phone,
      companyEmail: company_email,
})
```

`AdonisJs` believes in providing developing developer with best practices (conventions) out of the box with minimal configurations so that you can immediately focus on build your backend. `AdonisJs` also comes with lots of built-in packages and officially-maintained addons so that you immediately begin writing your code and don't worry about installing third-party extensions and sticking them together with more `glue codes`.

When you comfortable enough and need to extend the framework with custom features, `AdonisJs` provides interfaces and hooks for extending the core of the application and even extending the built-in packages.

Checkout the \[AdonisJS at a glance]\(AdonisJS at a glance) page for a beautiful summary of the features of the framework.

Some other features of the `AdonisJs` framework which you will love include:

1. `Community`. The `community` on GitHub and Discord is the best I've seen with members providing timely answers to issues you might have. The core team members including Harminder Virk are always available to assist with tougher questions.
2. `Docs`. The [documentation for AdonisJs](https://docs.adonisjs.com/guides/introduction) is well-written and covers all topics within the framework. You will find a friendly companion with it.
3. `TypeScript Support`. AdonisJs has first-class support for TypeScript. This means that TypeScript is not just a plugin, rather 100% of the core packages and addons are developed with TypeScript. AdonisJs has excellent intellisense support and you will be amazing with the confidence you will have while writing your code.
4. `Routing and Controllers`. AdonisJs offers server-side routing of requests. Each route can be configured to call methods within controller classes. The methods have access to the [context object](https://docs.adonisjs.com/guides/context) which exposes the `request`, `response`, `route`, `auth`, `bouncer`, `logger`, `params`, `session`, `view`, and `subdomain` objects. So you can quickly return the JSON responses or render and return HTML view from controller methods. Moreso, with the [Async Local Storage](https://docs.adonisjs.com/guides/async-local-storage), you can access the same context in any file outside your controller or middleware.
5. `File Uploads Management`. AdonisJs has built-in support for [file uploads](https://docs.adonisjs.com/guides/file-uploads) to the file storage or [directly to storage providers](https://docs.adonisjs.com/guides/direct-file-uploads) such as Amazon S3 or Google Drive or Cloudinary.
6. `Server-side rendering`. AdonisJs comes with the `Edge` [templating engine](https://docs.adonisjs.com/guides/views/introduction) which you can use to build server-side rendered applications instead of single-page applications.
7. `Request Validator`. AdonisJs has a built-in [Validator package](https://docs.adonisjs.com/guides/validator/introduction) for validating data sent from the frontend before they are saved to the database.
8. `Database & ORM`. AdonisJs has the [Lucid package](https://docs.adonisjs.com/guides/database/introduction) for performing database operations. It includes a [fluent ORM](https://docs.adonisjs.com/guides/models/introduction) with support for hooks, query scopes, serialization, relationships, seeders, and factories.
9. `Middleware`. One of the most beautiful features of AdonisJs is how easy it is to write and configure middlewares. You can use middlewares to intercept requests at the route definition, perform extra checks, and inject more data into the `context` object before the controller method is called.
10. `Authentication`. AdonisJs comes with the `auth` package which provides [different mechanisms for authentications](https://docs.adonisjs.com/guides/auth/introduction) within your application. It also includes [social authentications](https://docs.adonisjs.com/guides/auth/social).
11. `Security`. AdonisJs comes with the `shield` [package](https://docs.adonisjs.com/guides/security/web-security) which provides protection against web vulnerabilities such as CSRF, XSS, and Content Sniffing for your server-rendered applications. Your can also enable CORS to protect your `API server` from being called outside authorised origins.
12. `Hashing and Encryption`. AdonisJs has built-in support for [encryption](https://docs.adonisjs.com/guides/security/encryption) and [hashing](https://docs.adonisjs.com/guides/security/hashing) including [URL signing](https://docs.adonisjs.com/guides/security/signed-urls). You do not have to install extra packages for this.
13. `Authorization`. The `bouncer` [package](https://docs.adonisjs.com/guides/authorization) provides an authorization framework for AdonisJs. You can setup checks against an authenticated user and limit what resource or operations they have access to.
14. The built-in [Logger package](https://docs.adonisjs.com/guides/logger) can be used for application-wide logging.
15. The asynchronous [event emitter](https://docs.adonisjs.com/guides/events) provides ability to setup and listen to events across the application.
16. The `mailer` [package](https://docs.adonisjs.com/guides/mailer) is available for sending emails.
17. The `Redis` [package](https://docs.adonisjs.com/guides/redis) is available for performing asynchronous operations on the Redis server.
18. `Deployment`. AdonisJs being a Nodejs framework can [easily be deployed](https://docs.adonisjs.com/guides/deployment) on VPS server via PM2 or to [Heroku](https://docs.adonisjs.com/cookbooks/deploy-to-heroku) or [Digital Ocean](https://docs.adonisjs.com/cookbooks/deploy-to-digial-ocean).

You will find details of all these in the [documentation](https://docs.adonisjs.com/guides/introduction).

Now, you understand why I chose AdonisJs.

See you in the next lesson where we'll setup our API server with AdonisJs.


*This document was generated from the live article page on https://ndianabasi.com/technical-blog/article/lnhm5oudx34yo2869gmcms37/why-choose-the-adonis-js-framework-full-stack-google-contacts-clone-with-adonis-js-node-js-and-quasar-framework-vue-js • 2026-06-07*
