Express-js无法获取我的静态文件,为什么?


308

我将代码简化为我可以做的最简单的express-js应用程序:

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

我的目录如下所示:

static_file.js
/styles
  default.css

但是,当我访问时http://localhost:3001/styles/default.css,出现以下错误:

Cannot GET / styles /
default.css

我正在使用express 2.3.3node 0.4.7。我究竟做错了什么?


Answers:


491

尝试http://localhost:3001/default.css

/styles在您的请求网址中使用:

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

查看此页面上的示例:

//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
谢谢。作为Node和Express的新手,在您发现Connect是中间件文档所在的地方之前,Express文档似乎是粗略的。
Nate 2012年

4
是的 这是我的情况下缺少的斜线
borisdiakur

在我的情况下,我没有意识到安装路径已包含在第二个示例中所说明的路径中。谢谢!
Mike Cheel

如果是新安装,则应验证Express模块​​是否已正确安装(expressjs.com/en/starter/installing.html),然后应检查路径和目录名称,如Giacomo所说的;)
Spl2nky

始终用于path.join克服跨平台目录分隔符的问题。path.join(__ dirname,'/')
Doug Chamberlain

35

我也有同样的问题。我已通过以下代码解决了该问题:

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

静态请求示例:

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

我需要一个更简单的解决方案。是否存在?


感谢您分享您的解决方案,无论它是否最佳。如果要重新打开该问题以进行优化,请考虑发布一个详细说明新情况的新问题。如果仅以优化为目的,则该问题可能更适合SO Code Review

15

default.css 应该可以在 http://localhost:3001/default.css

stylesapp.use(express.static(__dirname + '/styles'));只是告诉表现在看styles目录静态文件服务。它不会(令人困惑地)形成可用路径的一部分。


3
完全!你做的这是惯例express.js它/public具有cssjsimg文件夹,这样你就可以http://localhost:3001/css/default.css:)
套件桑德

15

这项工作对我来说:

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

9

在您的server.js中:

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

您已经分别声明了express和app,创建了一个名为“ public”的文件夹,或者根据需要创建了一个文件夹,但是您仍然可以访问这些文件夹。在您的模板src中,您已添加了/ public的相对路径(或您的目的地文件夹名称到静态文件)。当心路线上的酒吧。


6

对我有用的是:

而不是app.use(express.static(__dirname + 'public/images'));在您的app.js 中编写

只需写 app.use(express.static('public/images'));

即删除路径中的根目录名称。然后您可以在其他js文件中有效使用静态路径,例如:

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

希望这可以帮助 :)


这解决了我的问题。在我的代码中,即使使用__dirname串联(使用path.join),CSS路径也可以正常工作,而获取js却失败了。
Chim

我很高兴为您提供帮助:)
阿米尔·阿斯兰

5

我在我的应用程序中使用Bootstrap CSS,JS和Fonts。我在asset应用程序的根目录中创建了一个文件夹,并将所有这些文件夹放入其中。然后在服务器文件中添加以下行:

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

此行使我能够asset/asset路径前缀(如:)中加载目录中的文件http://localhost:3000/asset/css/bootstrap.min.css

现在,在视图中,我可以像下面这样简单地包括CSS和JS:

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

5

投放静态文件(css,图像,js文件)仅需两个步骤:

  1. 将css文件目录传递到内置的中间件express.static中

    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. 要访问CSS文件或图像,只需输入url http:// localhost:port / filename.css,例如:http:// localhost:8081 / bootstrap.css

注意:要将css文件链接到html,只需键入<link href="file_name.css" rel="stylesheet">

如果我写这段代码

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

要访问静态文件,只需输入url:localhost:port / css / filename.css,例如:http:// localhost:8081 / css / bootstrap.css

注意用html链接css文件只需添加以下行

<link href="css/file_name.css" rel="stylesheet">    

3

这个为我工作

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

我找到我的css文件并为其添加路由:

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

然后它似乎起作用。


我不推荐这种方法,因为您应该使用ExpressJS .use()express.static()方法将文件发送到的位置。否则,您将在公共目录中的每个文件中拥有这些路由器之一,这将需要大量维护。
Sgnl

这是一个变通方法,但我认为这不合适。如果您有许多CSS和JS文件,该如何维护?
arsho

0

除了上述内容之外,请确保静态文件路径以/(例如/ assets / css)开头,以便在主目录(/ main)上方的任何目录中提供静态文件


2
除了上面的什么?在您的答案中注明(如果需要的话,请注明给发帖人)。因此,通常会更改答案的顺序,以便可以看到所有答案,而不是前几个答案。我们不知道您在说什么。
Zachary Kniebel,2013年

0

如果您的设置

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

然后,
放入app.js

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

并参考您的style.css :(在某些.pug文件中):

link(rel='stylesheet', href='/static/stylesheets/style.css')

为什么要引入一个重命名步骤public-> static?我要说的是,这会使更多信息更加混乱。但是再间接访问通常是一件好事……
masterxilo

0
  1. 在Nodejs项目
    文件夹中创建一个名为“ public”的文件夹。
  2. 将index.html文件放入Nodejs项目文件夹。
  3. 将所有脚本和CSS文件放入公用文件夹。
  4. 采用 app.use( express.static('public'));

  5. 并以 index.html 正确的脚本路径<script type="text/javascript" src="/javasrc/example.js"></script>

现在一切正常。


0

静态目录

检查上面的图像(静态目录)的目录结构

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'))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.