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

有没有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 

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

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

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

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

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

 npm install http-server -g 

要使用它:

 cd D:\Folder http-server 

或者,像这样:

 http-server D:\Folder 

检查出来: https : //github.com/nodeapps/http-server

如果你不想使用现成的工具,你可以使用下面的代码,如我在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,正如我在前面的答案中提到的

 // 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 (eg in case you use sessions) response.setHeader('Access-Control-Allow-Credentials', true); 

UPDATE

正如Adrian在评论中提到的那样,他在这里写了一个ES6代码,里面有完整的解释,我只是在下面重新发布他的代码,以防代码由于任何原因从原始网站中删除:

 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. eg .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-staticreplaceconnect.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

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

 python -m SimpleHTTPServer [port] 

它运行良好,并带有Python。

连接可能是你在找什么。

安装容易:

 npm install connect 

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

 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的同一级别创build一个名为server.js的文件,内容如下:

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

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

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

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

 node server.js 

浏览到localhost:8080

如果你使用Express框架 ,这个function就准备好了。

要设置一个简单的文件服务应用程序只是这样做:

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

还有另外一个静态网页服务器,它非常棒:浏览器同步。

它可以使用节点包pipe理器进行下载:

 npm install -g browser-sync 

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

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

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

更多可以从BrowserSync中find

谢谢。

你可以尝试服务我

使用它非常简单:

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

就这样。

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

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

自助餐采用完全缓冲的方法 – 当你的应用程序启动时,所有的文件都被完全加载到内存中,所以你永远不会感觉到文件系统的烧毁。 实际上,这是非常有效的。 把光油放在你的应用程序前面,甚至可能会让它变慢。

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

看看这个链接 。

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

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

您可以访问您的文件,如http://hostname/Folder/file.zip

DEMO / PROTO SERVER ONLY

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

 const http = require('http'); const fs = require('fs'); const port = 3000; const app = http.createServer((req,res) => { res.writeHead(200); res.end(fs.readFileSync(__dirname + req.url)); }); app.listen(port); 

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

这里是我的一个文件/轻量级node.js静态文件的Web服务器宠物项目与无依赖性,我相信是一个快速和丰富的工具,它的使用就像在Linux / Unix / MacOSterminal上发出这个命令一样简单或Android上的termux )时,安装node.js(或Debian / Ubuntu上的nodejs-legacy ):

 curl pad.js.org | node 

(对于Windows用户,文档中存在不同的命令)

它支持不同的东西,我相信可以发现有用的,

  • 分层目录索引创build/服务
    • 具有不同标准的sorting能力
    • 在浏览器上通过[多文件]拖放和文件/纯文本复制粘贴和系统剪贴板屏幕截图粘贴在Chrome浏览器,Firefox和其他浏览器上可能会有一些限制(可以通过命令行closures它提供的选项)
    • 文件夹/音符创build/上传button
  • 为众所周知的文件types提供正确的MIME(可能会禁用该文件)
  • 作为npm包和本地工具安装的可能性,或者作为Docker永久服务的单线性安装
  • HTTP 206文件服务(多部分文件传输),用于更快的传输
  • 从terminal和浏览器控制台上载(实际上它最初是为其他页面/域上的浏览器的JS控制台的文件系统代理)
  • CORS下载/上传(也可以closures)
  • 简单的HTTPS集成
  • 轻量级命令行选项,实现更好的安全服务:
    • 通过node.js 8上的修补程序,您可以在不首先安装的情况下访问这些选项: curl pad.js.org | node - -h curl pad.js.org | node - -h
    • 或者首先通过[sudo] npm install -g pad.js将其作为系统全局npm包[sudo] npm install -g pad.js ,然后使用其安装版本访问其选项: pad -h
    • 或者使用默认提供的相对安全的选项提供的Docker镜像。 [sudo] docker run --restart=always -v /files:/files --name pad.js -d -p 9090:9090 quay.io/ebraminio/pad.js

使用该工具的文件夹索引的屏幕截图

上面描述的function主要logging在工具http://pad.js.org的主页上,通过我使用的一些不错的技巧,也是工具源本身的服务地点!;

工具源在GitHub上 ,欢迎您的反馈,function要求和</s>s!

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

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

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

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

安装

 npm install -g hostr 

改变工作的主任

 cd myprojectfolder/ 

并开始

 hostr 

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

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

在NPMregistry中searchhttps://npmjs.org/search?q=server ,我find了静态服务器https://github.com/maelstrom/static-server

曾经需要向同事发送一个文件,但不能打扰发送100MB的野兽电子邮件? 希望运行一个简单的示例JavaScript应用程序,但通过file:///协议运行它有问题吗? 想要在一个局域网上共享你的媒体目录,而不需要设置Samba,FTP或其他任何需要编辑configuration文件的东西? 那么这个文件服务器将使你的生活更容易一点。

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

 npm install -g static-server 

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

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

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

不幸的是, 它不能提供文件 🙂

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

 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服务器

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

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

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

我在工作和个人项目中使用休斯顿,对我来说效果很好。

https://github.com/alejandro/Houston

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

你还问为什么请求正在下降 – 不知道你的情况具体是什么原因,但总的来说,你更好地使用专用中间件(nginx,S3,CDN)服务器静态内容,因为节点真的没有为这种networking模式优化。 请参阅此处的进一步说明(第13项): http : //goldbergyoni.com/checklist-best-practice-of-node-js-in-production/

    Interesting Posts