Node.js quick file server (static files over HTTP)
是否有Node.js随时可用的工具(与
例如,如果我有
1 2 3 | D:\Folder\file.zip D:\Folder\file2.html D:\Folder\folder\file-in-folder.jpg |
然后从
我可以通过访问文件
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替换
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"
一条线?证明而不是承诺
第一个是
1 2 3 | npm i -g http-server // install hs C: epos // run with one line?? FTW!! |
第二个是ZEIT.co的
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 |
如果您需要注意更改,请参阅
还有另一个非常好的静态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上的
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
-
使用node.js 8上的补丁,您无需先安装即可访问这些选项:
上面描述的功能主要记录在http://pad.js.org工具的主页上,我使用的一些不错的技巧也是工具源本身也提供的地方!
工具源在GitHub上,它欢迎您的反馈,功能请求和?s!
我对这个页面上的任何答案都没有太多运气,但是,下面似乎可以解决问题。
添加包含以下内容的
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) |
还要确保您需要
您可以将
然后你可以运行
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'); }); |
看看那个链接。
您只需要安装
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 }); |
首先通过
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-serverThen 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 - 使用
1 | d:> serve d:\StaticSite |
它将显示您的静态文件夹所在的端口,只需导航到主机,如:
1 | http://localhost:3000 |
对于开发工作,你可以使用(表达4)
https://github.com/appsmatics/simple-httpserver.git
以下为我工作:
使用以下内容创建文件
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 |
在
1 | node app.js |
使用以下内容创建
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):
我在工作和个人项目中使用休斯顿,它对我很有用。
https://github.com/alejandro/Houston