Redirecionar para WWW NodeJS

A função de redirecionar para WWW é importante caso esteja usando um add-on como o cloudflare, por exemplo. Onde para obter os benefícios da CDN é necessário que seja usado o CNAME WWW.
Em PHP é bem documentado como poderia ser feito isso. Tanto no .htaccess quando no próprio código. Se for WordPress é mais fácil ainda, pois não é nem necessário editar nada manualmente.
Porém em NodeJS, a solução pode não parecer tão óbvia. Visto que é menos comum aplicações Node utilizando a Cloudflare.
Esse post será construído em cima do meu outro post sobre redirecionamento para HTTPS. Pois vários daqueles conceitos se aplicam para essa funcionalidade também.

Apenas redirecionar para WWW mantendo o protocolo

app.use((req, res, next) => {
    if (!req.hostname.startsWith("www."))
        res.redirect(`${req.headers["x-forwarded-proto"]}://www.${req.hostname}${req.url}`);
    else
        next();
});

Redirecionar para WWW e HTTPS em um único middleware

app.use((req, res, next) => {
    if (!req.hostname.startsWith("www.") || req.headers["x-forwarded-proto"] == "http")
        res.redirect(`https://www.${req.hostname}${req.url}`);
    else
        next();
});

Cuidado

Note que, ao contrário do exemplo dado no post sobre redirecionamento para HTTPS, esses middlewares não funcionam rodando localmente. Isso porque o req.hostname também funcionará localmente, e perguntar se ele inicia com www. sempre será falso. Ele então tentará redirecionar para https://www.localhost que não funcionará por três motivos. O primeiro é que não existe www para o localhost. O segundo é que ele não mantém a porta. Então não acessará pela 3000. O terceiro motivo é que se for usado o primeiro exemplo, que mantém o procolo, ele redirecionará para undefined://www.localhost. Pois o header x-forwarded-proto não é criado localmente.
Se um dos requisitos é que funcione localmente também, sem ser necessário identificar o ambiente e registrar a rota de acordo, veja os dois exemplos adaptados:

Exemplos acima porém funciona localmente também

Nesse caso, usamos o fato de que o header x-forwarded-proto só estar presente quando rodando na Umbler para a nossa vantagem. Pois exigindo que ele seja definido no If para dar continuidade as outras condições faz com que se ele não for definido, o redirecionamento nunca ocorrerá.

Apenas redirecionar para WWW mantendo o protocolo

app.use((req, res, next) => {
    if (req.headers["x-forwarded-proto"] != undefined && !req.hostname.startsWith("www."))
        res.redirect(`${req.headers["x-forwarded-proto"]}://www.${req.hostname}${req.url}`);
    else
        next();
});

Redirecionar para WWW e HTTPS em um único middleware

app.use((req, res, next) => {
    if (req.headers["x-forwarded-proto"] != undefined && (!req.hostname.startsWith("www.") || req.headers["x-forwarded-proto"] == "http"))
        res.redirect(`https://www.${req.hostname}${req.url}`);
    else
        next();
});