Configurando dois diretórios estáticos diferentes na estrutura node.js Express

101

É possível? Eu gostaria de configurar dois diretórios diferentes para servir arquivos estáticos. Digamos / public e / mnt

sNiCKY
fonte
2
Esta página parece dizer que é possível, mas não entra em muito mais detalhes do que isso.
alho

Respostas:

152

Você também pode definir o caminho de onde os arquivos estáticos serão veiculados na web, especificando um parâmetro adicional (primeiro) para use()assim:

app.use("/public", express.static(__dirname + "/public"));
app.use("/public2", express.static(__dirname + "/public2"));

Dessa forma, você obtém dois diretórios diferentes na web que espelham seus diretórios locais, e não um caminho de url que executa failover entre dois diretórios locais.

Em outras palavras, o padrão de URL:

http://your.server.com/public/*

Exibe arquivos do diretório local publicenquanto:

http://your.server.com/public2/*

Atende arquivos do diretório local public2 .

BTW, isso também é útil se você não quiser que o static sirva os arquivos da raiz do seu servidor, mas sim de um caminho mais qualificado.

HTH

contador de facetas
fonte
1
Perfeito @facetcounter! Apenas apontei um script para meu diretório! script (src = "/ public2 / alertTest.js")
Cody
Se estiver usando o React e tentando servir dois aplicativos separados, você precisa adicionar "homepage": "/public"e "homepage": "/public2"ao respectivo package.json do aplicativo react. Para obter mais informações sobre o uso de dois apps react, veja minha resposta aqui stackoverflow.com/a/48569896/4746648
Danny Harding
isto é muito útil especialmente quando você quer uma sharedpasta para que você pode usar "./"e "./shared"e crescer você pode facilmente compartilhar arquivos js: 3 Obrigado
Jaacko Torus
55

Você também pode "mesclar" diretórios em um único diretório visível

Estrutura de Diretório

  • /static
  • /alternate_static

Código

app.use("/static", express.static(__dirname + "/static"));
app.use("/static", express.static(__dirname + "/alternate_static"));

Ambos static e alternate_static serão exibidos como se estivessem no mesmo diretório. No entanto, esteja atento para informações sobre nomes de arquivos.

Randolpho
fonte
6
Se bem entendi, conflitos de nome de arquivo não acontecem porque o node usa a primeira versão do arquivo que encontra. Se ele vê main.jsem static/que não vai continuar a olhar em alternate_static/.
RobW
2
Isso ainda é um problema se você esperava que o arquivo alternate_staticalgum dia fosse entregue.
Randolpho
41

Não é possível por uma injeção de middleware, mas você pode injetar staticmiddleware várias vezes:

app.configure('development', function(){
    app.use(express.static(__dirname + '/public1'));
    app.use(express.static(__dirname + '/public2'));
});

Explicação

Olhe para connect / lib / middleware / static.js # 143 :

path = normalize(join(root, path));

Existe options.rootuma raiz estática, que você define em express.staticou connect.staticchama, e pathé o caminho da solicitação.

Veja mais em connect / lib / middleware / static.js # 154 :

  fs.stat(path, function(err, stat){
    // ignore ENOENT
    if (err) {
      if (fn) return fn(err);
     return ('ENOENT' == err.code || 'ENAMETOOLONG' == err.code)
       ? next()
       : next(err);

O caminho é verificado apenas uma vez e, se o arquivo não for encontrado, a solicitação é passada para o próximo middleware.

Atualização para Connect 2.x

Os links para o código são inativos para o Connect 2.x, mas o uso de vários middlewares estáticos ainda é possível como antes.

Phillip Kovalev
fonte
0
const express = require('express');
const path = require('path');
const pagesPath = path.join(__dirname, '/cheatsheet');
const cssPath = path.join(__dirname, '/stylesheet');
const port = process.env.PORT || 3000;

var app = express();

app.use("/cheatsheet" ,express.static(pagesPath));
app.use("/stylesheet",express.static(cssPath)); 

app.get('/',(request,response)=>{
    response.send('Hello CSS!!!');
  });

app.get('/bad',(request,response)=>{
response.send({error: 'Bad Request'});

});
app.listen(port, ()=> {
console.log(`Server is running on Port ${port}` );
console.log(__dirname);

});

// folder structure
/cheatsheet/index.html
/stylesheet/style.css
Ajay Ruhela
fonte