Because of the MVC architecture with which Sails apps are created, you'll find the task of separating the business logic from the user interface and keeping the interactions between them in a separate layer, extremely easy.
Sails was created to add stronger conventions to Express apps, as well as to have an ORM which could work transparently with both NoSQL and SQL databases. It works on a bit of a higher level on the development stack as Express, and the fact that it's built on top of it means that Sails does not have to deal with the most lower level stuff (such as critical performance and consistency issues across many different modules, like the Express router, cookie parser, body parser, etc...)
Sails.js uses Waterline ORM at its backend which means you can store your data in any datastore that you like; all you have to do is make a change to the Waterline adapter, this will allow you to store your data in MySQL/Redis or any other kind of database.
Sails follows the Convention over Configuration philosophy. This is shown even through the CLI that comes with it which quickly and painlessly generates and scaffolds a new project following the conventions already established by the Sails community.
Sails.js is built with a focus on building real time communication apps such as chat or multiplayer games, so naturally it has Socket.io extremely well supported.
The Waterline ORM is a bit limited. Associations were finally added after much time and many requests. However, they are (as of 2015) still incomplete. It is not a great ORM for MongoDB. You will very likely be using native MongoDB queries throughout your code more than you might like (for example, in the event you want to use Mongo's $inc to increment something). It's strange that Sails did not simply leverage an existing ORM for their frameworks. Many people fall into the trap of wanting to build their own despite many other existing solutions. It is only then that they realize just how much work goes into an ORM. Fortunately you can bring in whatever packages you want to use with Sails.js.
One of the major benefits that Sails has is performance. But it's not as efficient when starting up. sails lift takes quite a lot of time to execute completely (although it is doing a lot of things behind the scenes - if you run it with the --verbose option, you can see all the different things it's doing).
Granted, this would be perfectly fine if you had to execute sails lift just once, but unfortunately every time that you change anything you have to stop and start lift again.
All the first-party frontend integrations revolve around React, even the Vue ones, which will duplicate quite a bit of vue functionality. You can however use the vanilla-js client library which is not opinionated about frontend frameworks, but lacks several time saving tool integrations such as state management and reactivity.
Feathers makes extensive use of modules (which are called Feathers services). These services work like ExpressJS middleware and can be used with app.use('/path', serviceObject).
Services help developers keep their applications modular and as minimal as possible, without any unnecessary libraries or bloat.
FeatherJS uses primus which is a universal wrapper for real-time frameworks. Through primus you can easily choose which socket transport you want to use.
Through services, Feathers provides instant CRUD functionality, it also can easily expose a RESTful and real-time API through HTTP/HTTPS and websockets.
Feather can sync events happening in two different Node processes or even servers in real-time. For example: an event happens in server A, the user connected to server B is instantly notified of that event.
This is done through a central Redis or Mongo collection or through a websocket libraries' clustering library.
Since Feathers itself is built on top of Express (it's a thin wrapper over socket.io, primus and Express) and because of Feathers' highly modular nature, it's very easy to integrate Feathers in an existing Express project.
Although the documentation for Feathers is very good, it still needs some configuration in order to get Feathers up for developing something with it. That said, the learning curve is considerably reduced if you are already experienced with ExpressJS.
Being built from two of the oldest Node libraries where each of them has had several releases and constant bug fixes and patches means that express.io is a rather mature solution for building realtime web applications.
Not only express, but every Node framework has this problem. While there exist plugins and libraries that allow developers to use relational databases in their web applications, they are not very good and usually it's a hassle and more trouble than it's worth to use a relational database with Node and express.
Express is the most used Node.js web framework and this brings a large number of learning resources, guides, tutorials and many libraries available for it.
Since Express.io is basically just the Express framework + socket.io, it's very easy to upgrade an express app to an express.io app.
First run: npm install express.io
Then swap require('express') to require('express.io') and it will run the same as before.