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?


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'));

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?


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.


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'));

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.


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 :)


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">

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">    

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')));


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.


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)


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')

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.


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'))
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.