我已经将我的代码简化为我可以做的最简单的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.3和节点0.4.7。我做错了什么?


当前回答

Webpack让事情变得尴尬

作为对所有其他现有解决方案的补充:

首先:如果你将文件和目录的路径建立在cwd(当前工作目录)上,事情应该照常工作,因为cwd是你启动node(或npm start, yarn run等)时所在的文件夹。

然而……

如果你正在使用webpack, __dirname行为将非常不同,这取决于你的节点。__dirname设置和你的webpack版本:

In Webpack v4, the default behavior for __dirname is just /, as documented here. In this case, you usually want to add this to your config which makes it act like the default in v5, that is __filename and __dirname now behave as-is but for the output file: module.exports = { // ... node: { // generate actual output file information // see: https://webpack.js.org/configuration/node/#node__filename __dirname: false, __filename: false, } }; This has also been discussed here. In Webpack v5, per the documentation here, the default is already for __filename and __dirname to behave as-is but for the output file, thereby achieving the same result as the config change for v4.

例子

例如,让我们说:

需要添加静态公用文件夹 它位于你的输出文件夹(通常是dist)旁边,在dist文件夹中没有子文件夹,它可能是这样的

const ServerRoot = path.resolve(__dirname /** dist */, '..');
// ...
app.use(express.static(path.join(ServerRoot, 'public'))

(重要的是:再次强调,这是独立于你的源文件在哪里,只看你的输出文件在哪里!)

更高级的Webpack场景

如果在不同的输出目录中有多个入口点,事情会变得更复杂,因为同一文件的__dirname对于输出文件(即条目中的每个文件)可能是不同的,这取决于该源文件合并到的输出文件的位置,更糟糕的是,相同的源文件可能合并到多个不同的输出文件中。

你可能想要避免这种场景,或者,如果你不能避免它,使用Webpack来管理和注入正确的路径,可能是通过DefinePlugin或EnvironmentPlugin。

其他回答

在你的nodejs文件中

const express = require('express');
const app = express();

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

你的哈巴狗档案里

...
script(type="text/javascript", src="static/your_javascript_filename")
...

注意“静态”这个词。nodejs文件和pug文件必须相同。

Webpack让事情变得尴尬

作为对所有其他现有解决方案的补充:

首先:如果你将文件和目录的路径建立在cwd(当前工作目录)上,事情应该照常工作,因为cwd是你启动node(或npm start, yarn run等)时所在的文件夹。

然而……

如果你正在使用webpack, __dirname行为将非常不同,这取决于你的节点。__dirname设置和你的webpack版本:

In Webpack v4, the default behavior for __dirname is just /, as documented here. In this case, you usually want to add this to your config which makes it act like the default in v5, that is __filename and __dirname now behave as-is but for the output file: module.exports = { // ... node: { // generate actual output file information // see: https://webpack.js.org/configuration/node/#node__filename __dirname: false, __filename: false, } }; This has also been discussed here. In Webpack v5, per the documentation here, the default is already for __filename and __dirname to behave as-is but for the output file, thereby achieving the same result as the config change for v4.

例子

例如,让我们说:

需要添加静态公用文件夹 它位于你的输出文件夹(通常是dist)旁边,在dist文件夹中没有子文件夹,它可能是这样的

const ServerRoot = path.resolve(__dirname /** dist */, '..');
// ...
app.use(express.static(path.join(ServerRoot, 'public'))

(重要的是:再次强调,这是独立于你的源文件在哪里,只看你的输出文件在哪里!)

更高级的Webpack场景

如果在不同的输出目录中有多个入口点,事情会变得更复杂,因为同一文件的__dirname对于输出文件(即条目中的每个文件)可能是不同的,这取决于该源文件合并到的输出文件的位置,更糟糕的是,相同的源文件可能合并到多个不同的输出文件中。

你可能想要避免这种场景,或者,如果你不能避免它,使用Webpack来管理和注入正确的路径,可能是通过DefinePlugin或EnvironmentPlugin。

这个方法对我很管用

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

提供__dirname的问题是__dirname返回当前文件的路径,而不是项目的文件。 此外,如果使用动态头文件,每个页面将在不同的路径中查找静态文件,这将不起作用。 对我来说,最好的方法是用__dirname代替process.cwd(),它总是将路径捐赠给项目文件。

app.use(express.static(process.cwd() + '/public'));

在你的项目中:

link rel="stylesheet" href="/styles/default.css"

参见:process.cwd()与__dirname之间的区别是什么?

服务静态文件(css,图像,js文件)只需两步:

将CSS文件的目录传递给内置中间件express.static Var express = require('express'); Var app = express(); /*public是我项目目录下的文件夹,包含三个文件夹 css,形象,js * / //css =>文件夹包含css文件 //image=>文件夹包含图片 //js =>文件夹包含javascript文件 app.use(表达。静态(公共/ css)); 要访问CSS文件或图像,只需输入url http://localhost:port/filename.css ex: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

注意链接CSS文件与HTML只需添加下面的行

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