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
- 通过node.js 8上的修补程序,您可以在不首先安装的情况下访问这些选项:
上面描述的function主要logging在工具http://pad.js.org的主页上,通过我使用的一些不错的技巧,也是工具源本身的服务地点!;
工具源在GitHub上 ,欢迎您的反馈,function要求和</s>s!
它不是在NPM上,但是我在Express上构build了一个简单的静态服务器,它还允许您接受表单提交,并通过交易电子邮件服务(现在是Sendgrid,Mandrill即将到来)发送电子邮件。
这是另一个简单的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
我在工作和个人项目中使用休斯顿,对我来说效果很好。
如果您对超轻型http服务器没有任何先决条件感兴趣,您应该看看: mongoose
你还问为什么请求正在下降 – 不知道你的情况具体是什么原因,但总的来说,你更好地使用专用中间件(nginx,S3,CDN)服务器静态内容,因为节点真的没有为这种networking模式优化。 请参阅此处的进一步说明(第13项): http : //goldbergyoni.com/checklist-best-practice-of-node-js-in-production/