【问题标题】:Node.js quick file server (static files over HTTP)Node.js 快速文件服务器(HTTP 上的静态文件)
【发布时间】:2013-04-26 08:58:57
【问题描述】:

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

例如,如果我有

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

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

访问文件
http://hostname/file.zip
http://hostname/file2.html
http://hostname/folder/file-in-folder.jpg

Why is my node static file server dropping requests? 参考一些神秘的

标准 node.js 静态文件服务器

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

相关: Basic static file server in NodeJS

【问题讨论】:

标签: node.js http fileserver


【解决方案1】:

一个好的“即用型工具”选项可能是 http-server:

npm install http-server -g

使用它:

cd D:\Folder
http-server

或者,像这样:

http-server D:\Folder

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

【讨论】:

  • 这太棒了。由于某种原因,我需要指定一个地址 bc,默认 0.0.0.0 与我的开发环境不合作。 http-server -a localhost 被拒绝了。
  • 我使用http-server -a localhost -p 80
  • 检查browser-sync 也是值得的,它或多或少可以做同样的事情,但在文件被修改时会实时更新。
  • --cors 发送Access-Control-Allow-Origin:* 以及响应头(即在提供 json 文件时)
  • npx http-server - npx 把它变成一个单行程序,下载必要的文件并运行它。
【解决方案2】:

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

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+' ..\n');
                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/');

更新 如果您需要从外部需求/文件访问您的服务器,您需要在 node.js 文件中通过编写以下代码来克服 CORS,正如我在之前的回答 here 中提到的那样

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

更新

正如 Adrian 所提到的,在 cmets 中,他编写了一个 ES6 代码,并附有完整的解释 here,我只是在下面重新发布了他的代码,以防代码因任何原因从原始站点中消失:

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 extension. e.g. .js, .doc, ...
  const ext = path.parse(pathname).ext;
  // maps file extension 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 extension
    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}`);

【讨论】:

【解决方案3】:

对于希望在 NodeJS 脚本中运行服务器的人:

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

myapp.js:

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

【讨论】:

  • 仅供参考这对我不起作用。我使用npm install filehandler 安装了文件处理程序,并且包在node_modules 目录中列出。但是当我运行myapp.js 时,节点会抛出一个错误,说Error: cannot find module filehandler。如果我注释掉加载 filehandler 的 require ststment 应用程序加载 serve-static 就好了,所以看起来 filhandler 包有问题。今天是 2014 年 12 月 12 日,所以自发布此答案以来,包裹可能发生了变化?
  • 这是 final 处理程序而不是 file
  • 此解决方案的另一个优点是,文件不会被缓存,因此您在更改代码时无需重新启动进程。
【解决方案4】:

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

python -m SimpleHTTPServer [port]

它运行良好,并带有 Python。

【讨论】:

  • Python3 等价物:python -m http.server [port](上面提到的是 Python2)
  • Python 在提供诸如操作系统映像之类的大文件时对我来说失败了。 Fedora 23
  • 在 PHP 上:php -S localhost:8000
  • 我一直使用它来快速提供文件夹中的内容。
  • NodeJs 等效 npx http-server [-p 8000] [<dir>]
【解决方案5】:

connect 可能就是您要找的。​​p>

轻松安装:

npm install connect

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

var connect = require('connect'),
    directory = '/path/to/Folder';

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

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

【讨论】:

  • 这在连接 3 中不再起作用,因为它不会暴露 connect.static;看到我的answer below 更换
  • 我相信它仍然默认与 express 捆绑在一起,但现在确实存在于单独的 requireable 模块“serve-static”中。
【解决方案6】:

从 npm@5.2.0,npm 开始在通常的 npm 旁边安装一个名为 npx 的新二进制文件。所以现在,一个衬垫从当前目录创建静态 http 服务器:

npx serve

npx http-server

【讨论】:

    【解决方案7】:

    One-line™ Proofs 代替 Promise

    第一个是http-serverhs - link

    npm i -g http-server   // install
    hs C:\repos            // run with one line?? FTW!!
    

    第二个是serve by ZEIT.co - link

    npm i -g serve         // install
    serve C:\repos         // run with one line?? FTW!!
    

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

    C:\Users\Qwerty>http-server --help 用法:http-server [路径] [选项] 选项: -p 要使用的端口 [8080] -a 地址使用 [0.0.0.0] -d 显示目录列表 [true] -i 显示自动索引 [true] -g --gzip 尽可能提供 gzip 文件 [false] -e --ext 如果没有提供默认文件扩展名 [无] -s --silent 禁止输出中的日志消息 --cors[=headers] 通过“Access-Control-Allow-Origin”标头启用 CORS 可选择提供用逗号分隔的 CORS 标头列表 -o [路径] 启动服务器后打开浏览器窗口 -c 以秒为单位的缓存时间(max-age)[3600],例如-c10 10 秒。 要禁用缓存,请使用 -c-1。 -U --utc 在日志消息中使用 UTC 时间格式。 -P --proxy 如果请求无法解析,则备用代理。例如:http://someurl.com -S --ssl 启用 https。 -C --cert ssl 证书文件的路径(默认值:cert.pem)。 -K --key ssl 密钥文件的路径(默认值:key.pem)。 -r --robots 响应 /robots.txt [User-agent: *\nDisallow: /] -h --help 打印此列表并退出。 C:\Users\Qwerty>服务 --help 用法:serve.js [选项] [命令] 命令: 帮助 显示帮助 选项: -a, --auth 在基本身份验证之后服务 -c, --cache 在浏览器中缓存文件的时间(以毫秒为单位) -n, --clipless 不要将地址复制到剪贴板(默认禁用) -C, --cors Setup * CORS 标头允许来自任何来源的请求(默认禁用) -h, --help 输出使用信息 -i, --ignore 要忽略的文件和目录 -o, --open 在浏览器中打开本地地址(默认禁用) -p, --port 监听端口(默认为 5000) -S, --silent 不向控制台记录任何内容 -s, --single 服务单页应用程序(将 `-c` 设置为 1 天) -t, --treeless 不显示静态树(默认禁用) -u, --unzipped 禁用 GZIP 压缩 -v, --version 输出版本号

    如果您需要注意更改,请参阅hostr,信用Henry Tseng's answer

    【讨论】:

      【解决方案8】:

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

      在 index.html 的同一级别创建一个名为 server.js 的文件,其中包含以下内容:

      var express = require('express');
      var server = express();
      server.use(express.static(__dirname));
      server.listen(8080);
      

      这将加载您的 index.html 文件。如果您希望指定要加载的 html 文件,请使用以下语法:

      server.use('/', express.static(__dirname + '/myfile.html'));
      

      如果你想把它放在不同的位置,在第三行设置路径:

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

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

      node server.js
      

      浏览到 localhost:8080

      【讨论】:

      • 嗨,我可以正确运行它,但它显示Cannot GET /。我使用 AWS EC2 运行服务器。
      • @Wei 嗨,迟到的答案。从我从快速谷歌搜索中可以看出,您的目录结构可能是错误的。您要定位的位置必须有一个 index.html 文件。设置上面的示例运行应该需要 5 分钟,我仔细检查了它是否按原样运行。从那里您可以调整路径以适合您的目录结构并检查服务器是否仍然找到它需要服务器的文件。
      • path.join(__dirname, 'public') 更加跨平台。
      【解决方案9】:

      #DEMO/PROTO SERVER 仅限

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

      const fs = require('fs'),
            http = require('http'),
            arg = process.argv.slice(2),
            rootdir = arg[0] || process.cwd(),
            port = process.env.PORT || 9000,
            hostname = process.env.HOST || '127.0.0.1';
      //tested on node=v10.19.0
      http.createServer(function (req, res) {
      
        try {
          // change 'path///to/////dir' -> 'path/to/dir'
          req_url = decodeURIComponent(req.url).replace(/\/+/g, '/');
      
          stats = fs.statSync(rootdir + req_url);
      
          if (stats.isFile()) {
            buffer = fs.createReadStream(rootdir + req_url);
            buffer.on('open', () => buffer.pipe(res));
            return;
          }
      
          if (stats.isDirectory()) {
            //Get list of files and folder in requested directory
            lsof = fs.readdirSync(rootdir + req_url, {encoding:'utf8', withFileTypes:false});
            // make an html page with the list of files and send to browser
            res.writeHead(200, {'Content-Type': 'text/html; charset=utf-8'});
            res.end(html_page(`http://${hostname}:${port}`, req_url, lsof));
            return;
          }
      
        } catch (err) {
            res.writeHead(404);
            res.end(err);
            return;
        }
      }).listen(port, hostname, () => console.log(`Server running at http://${hostname}:${port}`));
      
      
      function html_page(host, req_url, lsof) {//this is a Function declarations can be called before it is defined
        // Add link to root directory and parent directory if not already in root directory
        list = req_url == '/' ? [] : [`<a href="${host}">/</a>`,
        `<a href="${host}${encodeURI(req_url.slice(0,req_url.lastIndexOf('/')))}">..</a>`];
      
        templete = (host, req_url, file) => {// the above is a Function expressions cannot be called before it is defined
          return `<a href="${host}${encodeURI(req_url)}${req_url.slice(-1) == '/' ? '' : '/'}${encodeURI(file)}">${file}</a>`; }
      
        // Add all the links to the files and folder in requested directory
        lsof.forEach(file => {
          list.push(templete(host, req_url, file));
        });
      
        return `
      <!DOCTYPE html>
      <html lang="en">
      <head>
        <meta http-equiv="content-type" content="text/html" charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Directory of ${req_url}</title>
      </head>
      <body>
      <h2>Directory of ${req_url}</h2>
      ${list.join('<br/>\n')}
      </body>
      </html>`
      }
      

      【讨论】:

      • 不要使用同步版本。从 readStream 插入到 res 的创建管道。
      • 如果您需要一匹又快又脏的一次性小马,这是最佳答案。
      • 如果您想避免在地址中使用index.html,只需在res.writeHead(200); 之后添加if (req.url === '/') req.url = '/index.html';
      • @EduardBondarenko 是对的。 const stream = fs.createReadStream(...); stream.pipe(res); 就是你所需要的
      【解决方案10】:

      在普通的 node.js 中:

      const http = require('http')
      const fs = require('fs')
      const path = require('path')
      
      process.on('uncaughtException', err => console.error('uncaughtException', err))
      process.on('unhandledRejection', err => console.error('unhandledRejection', err))
      
      const publicFolder = process.argv.length > 2 ? process.argv[2] : '.'
      const port = process.argv.length > 3 ? process.argv[3] : 8080
      
      const mediaTypes = {
        zip: 'application/zip',
        jpg: 'image/jpeg',
        html: 'text/html',
        /* add more media types */
      }
      
      const server = http.createServer(function(request, response) {
        console.log(request.method + ' ' + request.url)
      
        const filepath = path.join(publicFolder, request.url)
        fs.readFile(filepath, function(err, data) {
          if (err) {
            response.statusCode = 404
            return response.end('File not found or you made an invalid request.')
          }
      
          let mediaType = 'text/html'
          const ext = path.extname(filepath)
          if (ext.length > 0 && mediaTypes.hasOwnProperty(ext.slice(1))) {
            mediaType = mediaTypes[ext.slice(1)]
          }
      
          response.setHeader('Content-Type', mediaType)
          response.end(data)
        })
      })
      
      server.on('clientError', function onClientError(err, socket) {
        console.log('clientError', err)
        socket.end('HTTP/1.1 400 Bad Request\r\n\r\n')
      })
      
      server.listen(port, '127.0.0.1', function() {
        console.log('?‍? Development server is online.')
      })
      

      这是一个简单的 node.js 服务器,只为特定目录中的请求文件提供服务。

      用法:

      node server.js folder port
      

      folder 可能是绝对的或相对的,具体取决于 server.js 的位置。默认值为.,即你执行node server.js命令的目录。

      port 默认为 8080,但您可以指定操作系统中可用的任何端口。

      在你的情况下,我会这样做:

      cd D:\Folder
      node server.js
      

      您可以在浏览器中输入http://127.0.0.1:8080/somefolder/somefile.html 浏览D:\Folder 下的文件

      【讨论】:

        【解决方案11】:

        还有一个相当不错的静态 Web 服务器:browser-sync。

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

        npm install -g browser-sync
        

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

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

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

        更多信息请关注BrowserSync

        谢谢。

        【讨论】:

        • 使用 Browsersync 而不是其他静态服务器的优势在于,只要--files 标志指定的文件发生更改,它就会实时更新页面(注意,您不需要指定./* -只有那些你希望 Browsersync 主动关注更新的,例如css/*.css)
        【解决方案12】:

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

        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

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

        工具源位于GitHub,欢迎您的反馈、功能请求和 ⭐s!

        【讨论】:

          【解决方案13】:

          我对这个页面上的任何答案都不太满意,但是,下面似乎可以解决问题。

          添加一个server.js文件,内容如下:

          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 文件中:

            "scripts": {
              "start": "node server.js"
            }
          

          【讨论】:

            【解决方案14】:

            您可以为此使用 NPM serve 包,如果您不需要 NodeJS 的东西,它是一个快速且易于使用的工具:

            1 - 在您的 PC 上安装软件包:

            npm install -g serve
            

            2 - 使用serve &lt;path&gt; 为您的静态文件夹提供服务:

            d:> serve d:\StaticSite
            

            它会显示你的静态文件夹正在服务哪个端口,只需导航到主机,如下所示:

            http://localhost:3000
            

            【讨论】:

            • 你意识到npm 是节点包管理器,所以你实际上是在使用 NodeJS 的东西
            • 我愿意,我所说的“NodeJS 的东西”是使用 NodeJS 和 express 来提供文件,就像大多数答案所建议的那样。 Serve 是一个独立的可执行文件,NPM 只是用来安装它,你可以直接下载它。
            【解决方案15】:

            以下对我有用:

            创建一个文件app.js,内容如下:

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

            创建一个文件index.html,内容如下:

            Hi
            

            启动命令行:

            cmd
            

            cmd下面运行:

            node app.js
            

            转到下面的 URL,在 chrome 中:

            http://localhost:8080/index.html
            

            就是这样。希望对您有所帮助。

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

            【讨论】:

              【解决方案16】:

              如果您使用Express framework,此功能已准备就绪。

              要设置一个简单的文件服务应用,只需这样做:

              mkdir yourapp
              cd yourapp
              npm install express
              node_modules/express/bin/express
              

              【讨论】:

              • 我可以 $ npm install -g express ;他们 $ 快递?
              • 我按照你的步骤,但是我的快递没有bin文件夹
              【解决方案17】:

              你可以试试serve-me

              使用它是如此简单:

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

              仅此而已。

              PD:默认服务的文件夹是“public”。

              【讨论】:

                【解决方案18】:

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

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

                安装

                npm install -g hostr
                

                更换工作主管

                cd myprojectfolder/
                

                然后开始

                hostr
                

                【讨论】:

                • 这也监视更改并提供实时重新加载。
                【解决方案19】:

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

                Buffet 采用完全缓冲的方法——当您的应用程序启动时,所有文件都完全加载到内存中,因此您永远不会感觉到文件系统的烧毁。在实践中,这是非常有效的。如此之多,以至于将 Varnish 放在您的应用程序前面甚至可能会使它变慢!

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

                例子:

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

                【讨论】:

                  【解决方案20】:

                  看看那个link

                  只需要安装node js的express模块​​即可。

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

                  您可以像http://hostname/Folder/file.zip一样访问您的文件

                  【讨论】:

                    【解决方案21】:

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

                    曾经需要向同事发送文件,但无法通过电子邮件发送 100MB的野兽?想运行一个简单的 JavaScript 示例 应用程序,但通过 file:/// 运行它时遇到问题 协议?想要在局域网上共享您的媒体目录,而无需 设置 Samba、FTP 或其他任何需要您编辑的内容 配置文件?那么这个文件服务器会让你的生活 容易一点。

                    要安装简单的静态东西服务器,请使用 npm:

                    npm install -g static-server
                    

                    然后要提供文件或目录,只需运行

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

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

                    很遗憾,it couldn't serve files :)

                    【讨论】:

                    • 我建立了那个服务器。该文件服务器是针对 非常 旧版本的 Node 构建的,因此它不再工作了。我现在没有时间修复它。我建议使用上面@Oleg 的答案。它可以很容易地捆绑到一个小的节点可执行文件中,而且基本上就是我所做的。
                    • 谢谢蒂姆,非常专业的回复。不过我不会删除代码,而是更新自述文件。
                    【解决方案22】:

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

                    【讨论】:

                      【解决方案23】:

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

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

                      另见Using node.js as a simple web server

                      【讨论】:

                        【解决方案24】:

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

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

                        【讨论】:

                          【解决方案25】:

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

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

                          【讨论】:

                          • 更新 - 我的答案有效,但我现在使用 @Matt Self 的使用 http-server 的答案。它似乎运作良好。
                          【解决方案26】:

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

                          【讨论】:

                            【解决方案27】:

                            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(`<strong>${staticFiles}</strong>File is not found.`);
                                      }
                                      res.end();
                                    });
                                  }
                            }).listen(8081);

                            【讨论】:

                            • 你应该在这段代码中添加一些解释。
                            【解决方案28】:

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

                            https://github.com/alejandro/Houston

                            【讨论】:

                              【解决方案29】:

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

                              【讨论】:

                              • 这是一个与 Node.js 解决方案无关的 C++ 服务器。此外,该线程中的名称具有误导性,因为它与 Node.js 的流行 MongoDB 层共享它的名称。
                              【解决方案30】:

                              您还询问了为什么请求下降 - 不确定您的具体原因是什么,但总体而言,您使用专用中间件(nginx、S3、CDN)更好地服务器静态内容,因为 Node 并没有针对这种网络模式进行优化。请参阅此处的进一步说明(第 13 条): http://goldbergyoni.com/checklist-best-practice-of-node-js-in-production/

                              【讨论】:

                                猜你喜欢
                                • 2014-11-17
                                • 2020-03-15
                                • 1970-01-01
                                • 2018-05-14
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                • 2013-12-08
                                相关资源
                                最近更新 更多