Node.js快速文件服务器(HTTP上的静态文件)

Node.js quick file server (static files over HTTP)

是否有Node.js随时可用的工具(与npm一起安装),这将帮助我将文件夹内容作为文件服务器通过HTTP公开。

例如,如果我有

1
2
3
D:\Folder\file.zip
D:\Folder\file2.html
D:\Folder\folder\file-in-folder.jpg

然后从D:\Folder\ node node-file-server.js开始
我可以通过访问文件

1
2
3
http://hostname/file.zip
http://hostname/file2.html
http://hostname/folder/file-in-folder.jpg

为什么我的节点静态文件服务器丢弃请求?
参考一些神秘的

standard node.js static file server

如果没有这样的工具,我应该使用什么框架?

有关:
NodeJS中的基本静态文件服务器


一个好的"随时可用的工具"选项可能是http-server:

1
npm install http-server -g

要使用它:

1
2
cd D:\Folder
http-server

或者,像这样:

1
http-server D:\Folder

看看:https://github.com/nodeapps/http-server


如果您不想使用现成工具,可以使用下面的代码,如我在https://developer.mozilla.org/en-US/docs/Node_server_without_framework中所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
var http = require('http');
var fs = require('fs');
var path = require('path');

http.createServer(function (request, response) {
    console.log('request starting...');

    var filePath = '.' + request.url;
    if (filePath == './')
        filePath = './index.html';

    var extname = path.extname(filePath);
    var contentType = 'text/html';
    switch (extname) {
        case '.js':
            contentType = 'text/javascript';
            break;
        case '.css':
            contentType = 'text/css';
            break;
        case '.json':
            contentType = 'application/json';
            break;
        case '.png':
            contentType = 'image/png';
            break;      
        case '.jpg':
            contentType = 'image/jpg';
            break;
        case '.wav':
            contentType = 'audio/wav';
            break;
    }

    fs.readFile(filePath, function(error, content) {
        if (error) {
            if(error.code == 'ENOENT'){
                fs.readFile('./404.html', function(error, content) {
                    response.writeHead(200, { 'Content-Type': contentType });
                    response.end(content, 'utf-8');
                });
            }
            else {
                response.writeHead(500);
                response.end('Sorry, check with the site admin for error: '+error.code+' ..
');
                response.end();
            }
        }
        else {
            response.writeHead(200, { 'Content-Type': contentType });
            response.end(content, 'utf-8');
        }
    });

}).listen(8125);
console.log('Server running at http://127.0.0.1:8125/');

UPDATE
如果你需要从外部需求/文件访问你的服务器,你需要在你的node.js文件中克服CORS,写下面的内容,正如我在上面的回答中提到的那样

1
2
3
4
5
6
7
8
9
10
11
12
// Website you wish to allow to connect
response.setHeader('Access-Control-Allow-Origin', '*');

// Request methods you wish to allow
response.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');

// Request headers you wish to allow
response.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');

// Set to true if you need the website to include cookies in the requests sent
// to the API (e.g. in case you use sessions)
response.setHeader('Access-Control-Allow-Credentials', true);

UPDATE

正如阿德里安所说,在评论中,他写了一个ES6代码并在此处给出了完整的解释,我只是在下面重新发布他的代码,以防代码因原因而离开原始网站:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
const http = require('http');
const url = require('url');
const fs = require('fs');
const path = require('path');
const port = process.argv[2] || 9000;

http.createServer(function (req, res) {
  console.log(`${req.method} ${req.url}`);

  // parse URL
  const parsedUrl = url.parse(req.url);
  // extract URL path
  let pathname = `.${parsedUrl.pathname}`;
  // based on the URL path, extract the file extention. e.g. .js, .doc, ...
  const ext = path.parse(pathname).ext;
  // maps file extention to MIME typere
  const map = {
    '.ico': 'image/x-icon',
    '.html': 'text/html',
    '.js': 'text/javascript',
    '.json': 'application/json',
    '.css': 'text/css',
    '.png': 'image/png',
    '.jpg': 'image/jpeg',
    '.wav': 'audio/wav',
    '.mp3': 'audio/mpeg',
    '.svg': 'image/svg+xml',
    '.pdf': 'application/pdf',
    '.doc': 'application/msword'
  };

  fs.exists(pathname, function (exist) {
    if(!exist) {
      // if the file is not found, return 404
      res.statusCode = 404;
      res.end(`File ${pathname} not found!`);
      return;
    }

    // if is a directory search for index file matching the extention
    if (fs.statSync(pathname).isDirectory()) pathname += '/index' + ext;

    // read file from file system
    fs.readFile(pathname, function(err, data){
      if(err){
        res.statusCode = 500;
        res.end(`Error getting the file: ${err}.`);
      } else {
        // if the file is found, set Content-type and send data
        res.setHeader('Content-type', map[ext] || 'text/plain' );
        res.end(data);
      }
    });
  });


}).listen(parseInt(port));

console.log(`Server listening on port ${port}`);


对于想要在NodeJS脚本中运行的服务器的人:

您可以使用expressjs / serve-static替换connect.static(从连接3开始不再可用):

myapp.js:

1
2
3
4
5
6
7
8
9
10
11
12
13
var http = require('http');

var finalhandler = require('finalhandler');
var serveStatic = require('serve-static');

var serve = serveStatic("./");

var server = http.createServer(function(req, res) {
  var done = finalhandler(req, res);
  serve(req, res, done);
});

server.listen(8000);

然后从命令行:

  • $ npm install finalhandler serve-static
  • $ node myapp.js


我知道它不是Node,但我使用了Python的SimpleHTTPServer:

1
python -m SimpleHTTPServer [port]

它运行良好,并附带Python。


连接可能是你正在寻找的。

安装方便:

1
npm install connect

然后最基本的静态文件服务器可以写成:

1
2
3
4
5
6
7
8
var connect = require('connect'),
    directory = '/path/to/Folder';

connect()
    .use(connect.static(directory))
    .listen(80);

console.log('Listening on port 80.');


使用npm安装express:https://expressjs.com/en/starter/installing.html

使用以下内容在index.html的同一级别创建名为server.js的文件:

1
2
3
4
var express = require('express');
var server = express();
server.use('/', express.static(__dirname + '/'));
server.listen(8080);

如果您希望将其放在其他位置,请在第三行设置路径:

1
server.use('/', express.static(__dirname + '/public'));

CD到包含您的文件的文件夹,并使用此命令从控制台运行节点:

1
node server.js

浏览本地主机:8080


仅限演示/投影服务器

如果这就是你所需要的,试试这个:

1
2
3
4
5
6
7
8
9
10
const http = require('http');
const fs = require('fs');
const port = 3000;
const app = http.createServer((req,res) => {
    res.writeHead(200);
    if (req.url === '/') req.url = '/index.html'; // courtesy of @JosephCho
    res.end(fs.readFileSync(__dirname + req.url));
});

app.listen(port);

注意:您需要使用"/index.html"作为地址的一部分,即"http:// localhost:3000 / index.html"


一条线?证明而不是承诺

enter image description here

第一个是http-serverhs - 链接

1
2
3
npm i -g http-server   // install
hs C:
epos            // run with one line?? FTW!!

第二个是ZEIT.co的serve - 链接

1
2
3
npm i -g serve         // install
serve C:
epos         // run with one line?? FTW!!


以下是可用选项,如果这有助于您做出决定。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
C:\Users\Qwerty>http-server --help
usage: http-server [path] [options]

options:
  -p           Port to use [8080]
  -a           Address to use [0.0.0.0]
  -d           Show directory listings [true]
  -i           Display autoIndex [true]
  -g --gzip    Serve gzip files when possible [false]
  -e --ext     Default file extension if none supplied [none]
  -s --silent  Suppress log messages from output
  --cors[=headers]   Enable CORS via the"Access-Control-Allow-Origin" header
                     Optionally provide CORS headers list separated by commas
  -o [path]    Open browser window after starting the server
  -c           Cache time (max-age) in seconds [3600], e.g. -c10 for 10 seconds.
               To disable caching, use -c-1.
  -U --utc     Use UTC time format in log messages.

  -P --proxy   Fallback proxy if the request cannot be resolved. e.g.: http://someurl.com

  -S --ssl     Enable https.
  -C --cert    Path to ssl cert file (default: cert.pem).
  -K --key     Path to ssl key file (default: key.pem).

  -r --robots  Respond to /robots.txt [User-agent: *
Disallow: /]
  -h --help    Print this list and exit.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
C:\Users\Qwerty>serve --help

  Usage: serve.js [options] [command]

  Commands:

    help  Display help

  Options:

    -a, --auth      Serve behind basic auth
    -c, --cache     Time in milliseconds for caching files in the browser
    -n, --clipless  Don't copy address to clipboard (disabled by default)
    -C, --cors      Setup * CORS headers to allow requests from any origin (disabled by default)
    -h, --help      Output usage information
    -i, --ignore    Files and directories to ignore
    -o, --open      Open local address in browser (disabled by default)
    -p, --port   Port to listen on (defaults to 5000)
    -S, --silent    Don't log anything to the console
    -s, --single    Serve single page applications (sets `-c` to 1 day)
    -t, --treeless  Don't display statics tree (disabled by default)
    -u, --unzipped  Disable GZIP compression
    -v, --version   Output the version number


如果您需要注意更改,请参阅hostr,感谢Henry Tseng的回答


还有另一个非常好的静态Web服务器:浏览器同步。

它可以使用节点包管理器下载:

1
npm install -g browser-sync

安装后,导航到cmd提示符中的项目文件夹,然后运行以下命令:

1
browser-sync start --server --port 3001 --files="./*"

它将开始迎合浏览器中当前文件夹中的所有文件。

可以从BrowserSync中找到更多内容

谢谢。


这是我的单文件/轻量级node.js静态文件web-server pet项目,没有依赖,我认为这是一个快速而丰富的工具,它的使用就像在Linux / Unix / macOS终端上发出此命令一样简单(或Android上的termux)安装node.js(或Debian / Ubuntu上的nodejs-legacy)时:

1
curl pad.js.org | node

(文档上的Windows用户存在不同的命令)

它支持我认为有用的不同的东西,

  • 分层目录索引创建/服务

    • 具有不同标准的排序功能
    • 通过浏览器上的[多文件]拖放和文件/纯文本复制粘贴以及Chrome,Firefox和其他浏览器上的系统剪贴板屏幕截图粘贴可能会有一些限制(可以通过命令行关闭)它提供的选项)
    • 文件夹/笔记创建/上传按钮
  • 为众所周知的文件类型提供正确的MIME(有可能禁用它)
  • 可以作为npm软件包和本地工具安装,或者作为Docker的永久服务进行单线程安装
  • HTTP 206文件服务(多部分文件传输),以实现更快的传输
  • 从终端和浏览器控制台上传(实际上它原本打算成为其他页面/域上浏览器的JS控制台的文件系统代理)
  • CORS下载/上传(也可以关闭)
  • 简单的HTTPS集成
  • 轻量级命令行选项,用于实现更好的安全服务:

    • 使用node.js 8上的补丁,您无需先安装即可访问这些选项:curl pad.js.org | node - -h
    • 或者首先通过[sudo] npm install -g pad.js将其安装为系统全局npm软件包,然后使用其安装的版本访问其选项:pad -h
    • 或者使用提供的Docker镜像,默认情况下使用相对安全的选项。 [sudo] docker run --restart=always -v /files:/files --name pad.js -d -p 9090:9090 quay.io/ebraminio/pad.js

Screenshot of a folder index using the tool

上面描述的功能主要记录在http://pad.js.org工具的主页上,我使用的一些不错的技巧也是工具源本身也提供的地方!

工具源在GitHub上,它欢迎您的反馈,功能请求和?s!


我对这个页面上的任何答案都没有太多运气,但是,下面似乎可以解决问题。

添加包含以下内容的server.js文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
const express = require('express')
const path = require('path')
const port = process.env.PORT || 3000
const app = express()

// serve static assets normally
app.use(express.static(__dirname + '/dist'))

// handle every other route with index.html, which will contain
// a script tag to your application's JavaScript file(s).
app.get('*', function (request, response){
  response.sendFile(path.resolve(__dirname, 'dist', 'index.html'))
})

app.listen(port)
console.log("server started on port" + port)

还要确保您需要express。根据您的设置运行yarn add express --savenpm install express --save(我可以推荐yarn它非常快)。

您可以将dist更改为您为内容提供的任何文件夹。对于我的简单项目,我没有在任何文件夹中提供服务,因此我只删除了dist文件名。

然后你可以运行node server.js。由于我必须将项目上传到Heroku服务器,我需要将以下内容添加到我的package.json文件中:

1
2
3
 "scripts": {
   "start":"node server.js"
  }

如果您使用Express框架,则可以使用此功能。

要设置简单的文件服务应用,请执行以下操作:

1
2
3
4
mkdir yourapp
cd yourapp
npm install express
node_modules/express/bin/express


为了使用节点提供静态资源来提高性能,我建议使用Buffet。它的工作方式类似于Web应用程序加速器,也称为缓存HTTP反向代理,但它只是将所选目录加载到内存中。

Buffet takes a fully-bufferred approach -- all files are fully loaded into memory when your app boots, so you will never feel the burn of the filesystem. In practice, this is immensely efficient. So much so that putting Varnish in front of your app might even make it slower! 

我们在codePile站点上使用它,并且在1k并发用户连接负载下下载25个资源的页面上发现~700请求/秒增加到> 4k请求/秒。

例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
var server = require('http').createServer();

var buffet = require('buffet')(root: './file'); 

 

server.on('request', function (req, res) {

  buffet(req, res, function () {

    buffet.notFound(req, res);

  });

});

 

server.listen(3000, function () {

  console.log('test server running on port 3000');

});

看看那个链接。

您只需要安装node js的快速模块。

1
2
3
4
var express = require('express');
var app = express();

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

您可以访问http://hostname/Folder/file.zip等文件


这是另一个简单的Web服务器。

https://www.npmjs.com/package/hostr

安装

1
npm install -g hostr

改变工作总监

1
cd myprojectfolder/

然后开始

1
hostr


你可以尝试发球

使用它很容易:

1
2
ServeMe = require('serve-me')();
ServeMe.start(3000);

就这样。

PD:默认提供的文件夹是"public"。


它不是在NPM上,但是我在Express上构建了一个简单的静态服务器,它还允许您接受表单提交并通过交易电子邮件服务发送电子邮件(现在是Sendgrid,Mandrill即将推出)。

https://github.com/jdr0dn3y/nodejs-StatServe


为了搜索者的利益,我喜欢Jakub g的答案,但想要一点错误处理。显然,最好正确处理错误,但这有助于防止站点在发生错误时停止。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var http = require('http');
var express = require('express');

process.on('uncaughtException', function(err) {
  console.log(err);
});

var server = express();

server.use(express.static(__dirname));

var port = 10001;
server.listen(port, function() {
    console.log('listening on port ' + port);    
    //var err = new Error('This error won't break the application...')
    //throw err
});


首先通过npm install node-static -g -g安装节点静态服务器是在系统上全局安装它,然后导航到文件所在的目录,用static启动服务器,它在端口8080上侦听,导航到浏览器,输入localhost:8080 / yourhtmlfilename。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
const http = require('http');
const fs = require('fs');
const url = require('url');
const path = require('path');


let mimeTypes = {
  '.html': 'text/html',
  '.css': 'text/css',
  '.js': 'text/javascript',
  '.jpg': 'image/jpeg',
  '.png': 'image/png',
  '.ico': 'image/x-icon',
  '.svg': 'image/svg+xml',
  '.eot': 'appliaction/vnd.ms-fontobject',
  '.ttf': 'aplication/font-sfnt'
};



http.createServer(function (request, response) {
  let pathName = url.parse(request.url).path;
  if(pathName === '/'){
    pathName = '/index.html';
  }
  pathName = pathName.substring(1, pathName.length);
  let extName = path.extName(pathName);
  let staticFiles = `${__dirname}/template/${pathName}`;

      if(extName =='.jpg' || extName == '.png' || extName == '.ico' || extName == '.eot' || extName == '.ttf' || extName == '.svg')
      {
          let file = fr.readFileSync(staticFiles);
          res.writeHead(200, {'Content-Type': mimeTypes[extname]});
          res.write(file, 'binary');
          res.end();
      }else {
        fs.readFile(staticFiles, 'utf8', function (err, data) {
          if(!err){
            res.writeHead(200, {'Content-Type': mimeTypes[extname]});
            res.end(data);
          }else {
            res.writeHead(404, {'Content-Type': 'text/html;charset=utf8'});
            res.write(`${staticFiles}File is not found.`);
          }
          res.end();
        });
      }
}).listen(8081);


一个简单的静态服务器使用连接

1
2
3
4
5
6
7
8
9
10
var connect = require('connect'),
  directory = __dirname,
  port = 3000;

connect()
  .use(connect.logger('dev'))
  .use(connect.static(directory))
  .listen(port);

console.log('Listening on port ' + port);

另请参见将node.js用作简单Web服务器


如果您对超轻型http服务器感兴趣,没有任何先决条件
你应该看看:猫鼬


在NPM注册表https://npmjs.org/search?q=server中搜索,我找到了静态服务器https://github.com/maelstrom/static-server

Ever needed to send a colleague a file, but can't be bothered emailing
the 100MB beast? Wanted to run a simple example JavaScript
application, but had problems with running it through the file:///
protocol? Wanted to share your media directory at a LAN without
setting up Samba, or FTP, or anything else requiring you to edit
configuration files? Then this file server will make your life that
little bit easier.

To install the simple static stuff server, use npm:

1
npm install -g static-server

Then to serve a file or a directory, simply run

1
2
$ serve path/to/stuff
Serving path/to/stuff on port 8001

这甚至可以列出文件夹内容。

不幸的是,它无法提供文件:)


您可以使用NPM服务包,如果您不需要NodeJS,它是一个快速且易于使用的工具:

1 - 在PC上安装软件包:

1
npm install -g serve

2 - 使用serve 提供静态文件夹:

1
d:> serve d:\StaticSite

它将显示您的静态文件夹所在的端口,只需导航到主机,如:

1
http://localhost:3000


对于开发工作,你可以使用(表达4)
https://github.com/appsmatics/simple-httpserver.git


以下为我工作:

使用以下内容创建文件app.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// app.js

var fs = require('fs'),
    http = require('http');

http.createServer(function (req, res) {
  fs.readFile(__dirname + req.url, function (err,data) {
    if (err) {
      res.writeHead(404);
      res.end(JSON.stringify(err));
      return;
    }
    res.writeHead(200);
    res.end(data);
  });
}).listen(8080);

启动命令行:

1
cmd

cmd中运行以下:

1
node app.js

使用以下内容创建index.html

1
Hi

转到以下网址,在Chrome中:

1
http://localhost:8080/index.html

资料来源:https://nodejs.org/en/knowledge/HTTP/servers/how-to-serve-static-files/

希望有所帮助。


您还询问了为什么请求正在下降 - 不确定您的案例的具体原因是什么,但总体而言,使用专用中间件(nginx,S3,CDN)可以更好地服务器静态内容,因为Node实际上并未针对此网络模式进行优化。见这里的进一步解释(项目符号13):

Checklist: Node.JS production best practices (August 2018)


我在工作和个人项目中使用休斯顿,它对我很有用。

https://github.com/alejandro/Houston