Express-js não pode obter meus arquivos estáticos, por quê?

308

Reduzi meu código para o aplicativo express-js mais simples que eu poderia criar:

var express = require("express"),
    app = express.createServer();
app.use(express.static(__dirname + '/styles'));
app.listen(3001);

Meu diretório fica assim:

static_file.js
/styles
  default.css

No entanto, ao acessar http://localhost:3001/styles/default.css, recebo o seguinte erro:

Cannot GET / styles /
default.css

Eu estou usando express 2.3.3e node 0.4.7. O que estou fazendo de errado?

Kit Sunde
fonte
confira abaixo ligação only4ututorials.blogspot.com/2017/05/...
Dexter

Respostas:

492

Tente http://localhost:3001/default.css.

Para ter /stylesno seu URL de solicitação, use:

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

Veja os exemplos nesta página :

//Serve static content for the app from the "public" directory in the application directory.

    // GET /style.css etc
    app.use(express.static(__dirname + '/public'));

// Mount the middleware at "/static" to serve static content only when their request path is prefixed with "/static".

    // GET /static/style.css etc.
    app.use('/static', express.static(__dirname + '/public'));
Giacomo
fonte
42
Obrigado. Como alguém novo no Node e Express, a documentação do Express parece incompleta até você descobrir que o Connect é onde estão os documentos do middleware.
Nate
4
Sim. Foi a barra que faltava no meu caso.
precisa saber é o seguinte
No meu caso, não percebi que o caminho da montagem foi incluído no caminho, como você explicou no segundo exemplo. Obrigado!
Mike Cheel
No caso de uma nova instalação, verifique se o seu módulo expresso está instalado corretamente ( expressjs.com/en/starter/installing.html ) e verifique o caminho e o nome do diretório como Giacomo disse;)
Spl2nky
sempre use path.joinpara superar problemas de separador de diretório de plataforma cruzada. path.join (__ dirname, '/')
Doug Chamberlain
35

Eu tenho o mesmo problema. Eu resolvi o problema com o seguinte código:

app.use('/img',express.static(path.join(__dirname, 'public/images')));
app.use('/js',express.static(path.join(__dirname, 'public/javascripts')));
app.use('/css',express.static(path.join(__dirname, 'public/stylesheets')));

Exemplo de solicitação estática:

http://pruebaexpress.lite.c9.io/js/socket.io.js

Eu preciso de uma solução mais simples. Isto existe?

David Miró
fonte
Obrigado por compartilhar sua solução, independentemente de ela ser ótima ou não. Se você deseja reabrir o problema para otimização, considere postar uma nova pergunta detalhando as novas circunstâncias. Se a otimização for o único objetivo, a questão poderá ser mais adequada para a Revisão de Código SO .
15

default.css deve estar disponível em http://localhost:3001/default.css

O stylesin app.use(express.static(__dirname + '/styles'));just diz ao express para procurar no stylesdiretório um arquivo estático para servir. Ele não faz (de maneira confusa) parte do caminho em que está disponível.

diff_sky
fonte
3
Totalmente! Que é por convenção em express.js você fizer isso no /publicque tem css, js, imgpastas para que você possa http://localhost:3001/css/default.css:)
Kit Sunde
15

Este trabalho para mim:

app.use('*/css',express.static('public/css'));
app.use('*/js',express.static('public/js'));
app.use('*/images',express.static('public/images'));
user3418903
fonte
9

No seu server.js:

var express   =     require("express");
var app       =     express();
app.use(express.static(__dirname + '/public'));

Você declarou express e app separadamente, cria uma pasta chamada 'public' ou como desejar e, no entanto, pode acessar essa pasta. No seu modelo src, você adicionou o caminho relativo de / public (ou o nome do destino da sua pasta aos arquivos estáticos). Cuidado com os bares nas rotas.

Baurin Leza
fonte
6

O que funcionou para mim é:

Em vez de escrever app.use(express.static(__dirname + 'public/images'));no seu app.js

Basta escrever app.use(express.static('public/images'));

ou seja, remova o nome do diretório raiz no caminho. E então você pode usar o caminho estático efetivamente em outros arquivos js, por exemplo:

<img src="/images/misc/background.jpg">

Espero que isto ajude :)

Amir Aslam
fonte
Isso resolveu meu problema. No meu código, o caminho para CSS estava funcionando bem, mesmo com a concatenação __dirname (usando path.join), enquanto a busca de js estava falhando.
Chim
Estou feliz que ajudou :)
Amir Aslam
5

Estou usando CSS, JS e fontes do Bootstrap no meu aplicativo. Criei uma pasta chamada assetno diretório raiz do aplicativo e coloque todas essas pastas dentro dele. Em seguida, no arquivo do servidor adicionado a seguinte linha:

app.use("/asset",express.static("asset"));

Esta linha permite-me para carregar os arquivos que estão no assetdiretório do /assetprefixo do caminho como: http://localhost:3000/asset/css/bootstrap.min.css.

Agora, nas visualizações, posso simplesmente incluir CSS e JS, como abaixo:

<link href="/asset/css/bootstrap.min.css" rel="stylesheet">
arsho
fonte
5

para servir arquivos estáticos (css, imagens, arquivos js) apenas duas etapas:

  1. passe o diretório de arquivos css para o middleware express.static integrado

    var express = require('express');
    var app = express();
    /*public is folder in my project directory contains three folders
    css,image,js
    */
    //css  =>folder contains css file
    //image=>folder contains images
    //js   =>folder contains javascript files
    app.use(express.static( 'public/css'));
  2. para acessar arquivos ou imagens css, digite o URL http: // localhost: port / filename.css ex: http: // localhost: 8081 / bootstrap.css

Nota: para vincular arquivos CSS a html, basta digitar<link href="file_name.css" rel="stylesheet">

se eu escrever esse código

var express = require('express');
var app = express();
app.use('/css',express.static( 'public/css'));

para acessar os arquivos estáticos, basta digitar url: localhost: port / css / filename.css ex: http: // localhost: 8081 / css / bootstrap.css

note que para vincular arquivos CSS com html basta adicionar a seguinte linha

<link href="css/file_name.css" rel="stylesheet">    
Ahmed Mahmoud
fonte
3

este funcionou para mim

app.use(express.static(path.join(__dirname, 'public')));

app.use('/img',express.static(path.join(__dirname, 'public/images')));

app.use('/shopping-cart/javascripts',express.static(path.join(__dirname, 'public/javascripts')));

app.use('/shopping-cart/stylesheets',express.static(path.join(__dirname, 'public/stylesheets')));

app.use('/user/stylesheets',express.static(path.join(__dirname, 'public/stylesheets')));

app.use('/user/javascripts',express.static(path.join(__dirname, 'public/javascripts')));
james gicharu
fonte
1

Tente acessá-lo com http: // localhost: 3001 / default.css .

   app.use(express.static(__dirname + '/styles'));

Na verdade, você está dando o nome da pasta, ou seja, os estilos, e não o seu suburl.

Sunil Lulla
fonte
1

Eu encontro meu arquivo css e adiciono uma rota a ele:

app.get('/css/MyCSS.css', function(req, res){
  res.sendFile(__dirname + '/public/css/MyCSS.css');
});

Então parece funcionar.

Bren
fonte
Eu não recomendaria essa abordagem, pois você deve usar os métodos .use()e ExpressJS express.static()para enviar para onde você está servindo seus arquivos. Caso contrário, você terá um desses roteadores por arquivo em seu diretório público e isso manterá muita sobrecarga.
Sgnl 01/01
Esta é uma solução alternativa, mas não acho que seja apropriado. Se você possui muitos arquivos CSS e JS, como pode mantê-lo?
Arsho #
0

Além do acima, verifique se o caminho do arquivo estático começa com / (ex ... / assets / css) ... para servir arquivos estáticos em qualquer diretório acima do diretório principal (/ main)

bigskier91
fonte
2
Além do que acima? Indique na sua resposta (dê crédito à pessoa que a postou, se for necessário). O SO frequentemente altera a ordem das respostas para que todas as respostas sejam vistas e não as primeiras. Não sabemos do que você está falando.
Zachary Kniebel
0

se sua configuração

myApp
  |
  |__ public
  |     |
  |     |__  stylesheets
  |     |     |
  |     |     |__ style.css
  |     |
  |     |___ img
  |           |
  |           |__ logo.png
  |
  |__ app.js

em seguida,
coloque em app.js

app.use('/static', express.static('public'));

e consulte o seu style.css: (em algum arquivo .pug):

link(rel='stylesheet', href='/static/stylesheets/style.css')
Bar Horing
fonte
Por que você introduziria uma etapa de renomeação public -> static? Eu diria que é apenas mais uma informação extra confusa. Mas, novamente, a indireção geralmente é uma coisa boa ...
masterxilo 5/01
0
  1. Crie uma pasta com o nome 'public' na
    pasta do projeto Nodejs .
  2. Coloque o arquivo index.html na pasta do projeto Nodejs.
  3. Coloque todos os scripts e arquivos css na pasta pública.
  4. Usar app.use( express.static('public'));

  5. e no index.html caminho correto dos scripts para<script type="text/javascript" src="/javasrc/example.js"></script>

E agora tudo funciona bem.

Hossein Mourdzadeh
fonte
0

diretório estático

verifique a imagem acima (diretório estático) para a estrutura dir

const publicDirectoryPath = path.join(__dirname,'../public')
app.use(express.static(publicDirectoryPath))


//  or

app.use("/", express.static(publicDirectoryPath))
app.use((req, res, next) => {
res.sendFile(path.join(publicDirectoryPath,'index.html'))
helloJT
fonte