使用express.js的静态文件

use*_*114 195 node.js express

我想将服务index.html/media子目录作为静态文件.索引文件应该在/index.html/URL处提供.

我有

web_server.use("/media", express.static(__dirname + '/media'));
web_server.use("/", express.static(__dirname));
Run Code Online (Sandbox Code Playgroud)

但第二行显然服务于整个__dirname,包括其中的所有文件(不只是index.htmlmedia),我不想要.

我也试过了

web_server.use("/", express.static(__dirname + '/index.html'));
Run Code Online (Sandbox Code Playgroud)

但访问基本URL /然后导致对web_server/index.html/index.html(双index.html组件)的请求,当然这会失败.

有任何想法吗?


顺便说一句,我可以在Express中找到关于这个主题的绝对文档(static()+它的参数)......令人沮丧.文档链接也是受欢迎的.

250*_*50R 179

如果你有这个设置

/app
   /public/index.html
   /media
Run Code Online (Sandbox Code Playgroud)

那么这应该得到你想要的

var express = require('express');
//var server = express.createServer();
// express.createServer()  is deprecated. 
var server = express(); // better instead
server.configure(function(){
  server.use('/media', express.static(__dirname + '/media'));
  server.use(express.static(__dirname + '/public'));
});

server.listen(3000);
Run Code Online (Sandbox Code Playgroud)

诀窍是将这一行留作最后一个后备

  server.use(express.static(__dirname + '/public'));
Run Code Online (Sandbox Code Playgroud)

至于文档,由于Express使用连接中间件,我发现直接查看连接源代码更容易.

例如,此行显示支持index.html https://github.com/senchalabs/connect/blob/2.3.3/lib/middleware/static.js#L140

  • `Application.configure()`被记录为3.x中的遗留物并在4.x中被删除.请参阅ChrisCantrell对更新示例的回答. (13认同)

Chr*_*ell 125

在最新版本的express中,不推荐使用"createServer".这个例子对我有用:

var express = require('express');
var app = express();
var path = require('path');

//app.use(express.static(__dirname)); // Current directory is root
app.use(express.static(path.join(__dirname, 'public'))); //  "public" off of current is root

app.listen(80);
console.log('Listening on port 80');
Run Code Online (Sandbox Code Playgroud)

  • __dirname实际上不是全局的,而是每个模块的本地. (7认同)
  • 它是nodejs模块中的全局.http://nodejs.org/docs/latest/api/globals.html#globals_dirname (6认同)
  • 这与你在`os.path.dirname(os.path.realpath(__ file __))中使用的`__file__`的python相同. (2认同)

小智 90

express.static()期望第一个参数是目录的路径,而不是文件名.我建议创建另一个子目录来包含你的index.html并使用它.

在Express 文档中提供静态文件,或更详细的serve-static文档,包括服务的默认行为index.html:

默认情况下,此模块将发送"index.html"文件以响应目录上的请求.要禁用此设置false或提供新索引,请按首选顺序传递字符串或数组.

  • 仅供参考,它将默认在其他目录中提供index.html (6认同)

xam*_*mir 37

res.sendFile&express.static都将此项工作

var express = require('express');
var app = express();
var path = require('path');
var public = path.join(__dirname, 'public');

// viewed at http://localhost:8080
app.get('/', function(req, res) {
    res.sendFile(path.join(public, 'index.html'));
});

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

app.listen(8080);
Run Code Online (Sandbox Code Playgroud)

public客户端代码所在的文件夹在哪里

作为建议通过@ATOzTOA由澄清 @Vozzie,path.join采取的路径加入作为参数时,+通过一个单一的参数路径.

  • `path.join`将路径连接为参数,`+`将单个参数传递给路径. (2认同)
  • 这帮助我将静态站点与 API 合二为一 (2认同)

Saa*_*ran 7

如果您有复杂的文件夹结构,例如

- application
     - assets
         - images
             - profile.jpg
     - web
     - server
        - index.js
Run Code Online (Sandbox Code Playgroud)

如果您想assets/imagesindex.js

app.use('/images', express.static(path.join(__dirname, '..', 'assets', 'images')))
Run Code Online (Sandbox Code Playgroud)

从浏览器查看

http://localhost:4000/images/profile.jpg
Run Code Online (Sandbox Code Playgroud)

如果您需要更多澄清评论,我会详细说明。


raj*_*app 6

const path = require('path');

const express = require('express');

const app = new express();
app.use(express.static('/media'));

app.get('/', (req, res) => {
    res.sendFile(path.resolve(__dirname, 'media/page/', 'index.html'));
});

app.listen(4000, () => {
    console.log('App listening on port 4000')
})
Run Code Online (Sandbox Code Playgroud)


小智 5

在你的 app.js 中使用下面的内容

app.use(express.static('folderName'));
Run Code Online (Sandbox Code Playgroud)

(folderName 是包含文件的文件夹) - 请记住这些资产是通过服务器路径直接访问的(即http://localhost:3000/abc.png (其中 abc.png 位于folderName 文件夹内)