Posso estar sendo vago e um pouco superficial aqui, mas acredito que a principal razão de se adotar o Express, é devido ao server com sistema de rotas. É muito chato fazer isso na mão, aqui um exemplo sem framework:
http.createServer(function (request, response) {
var path = url.parse(request.url, true).pathname;
if (request.method === 'POST') {
if (path === '/hifive') {
response.writeHead(200,{'Content-Type':'image/jpg'});
[...]
}
else {
response.end(404);
}
}
Já no Express, a coisa fica um pouco mais organizada e de fácil entendimento:
const express = require('express')
const app = express()
const port = 3000
app.get('/', (req, res) => {
res.send('Hello World!')
})
app.listen(port, () => {
console.log(`Example app listening on port ${port}`)
})
Algumas linguagens modernas como o Golang, já possuem um sistema de server e rotas 'built in', mas acredito que o node tem tudo para agregar funcionalidades como essa no futuro.
Espero ter ajudado, sei que é apenas um dos diversos aspectos e funcionaliades do Express, mas na minha opinião, é o que mais se destaca no primeiro contato.
Isso, é verdade. Mas existem algumas bibliotecas e frameworks que já entregam isso quase pontos. Sem contar no Nextjs que já deixa as rotas prontas pra usar. Então se for considerar isso como um ponto para usar o Express, existem alternativas melhores. Ainda não compreendi o porque de ele ser tão usado ainda, mas estou aqui pra aprender.