我想运行一个非常简单的HTTP服务器。对example.com的每个GET请求都应该得到index.html,但作为一个常规的HTML页面(即,与阅读普通网页时的体验相同)。

使用下面的代码,我可以读取index.html的内容。我如何服务index.html作为一个普通的网页?

var http = require('http');
var fs = require('fs');
var index = fs.readFileSync('index.html');

http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end(index);
}).listen(9615);

下面的一个建议很复杂,需要我为我想使用的每个资源(CSS、JavaScript、图像)文件写一个get行。

我如何能提供一个单一的HTML页面与一些图像,CSS和JavaScript?


当前回答

最快捷的方法:

var express = require('express');
var app = express();
app.use('/', express.static(__dirname + '/../public')); // ← adjust
app.listen(3000, function() { console.log('listening'); });

你的方法:

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

http.createServer(function (req, res) {
    console.dir(req.url);

    // will get you  '/' or 'index.html' or 'css/styles.css' ...
    // • you need to isolate extension
    // • have a small mimetype lookup array/object
    // • only there and then reading the file
    // •  delivering it after setting the right content type

    res.writeHead(200, {'Content-Type': 'text/html'});

    res.end('ok');
}).listen(3001);

其他回答

与其处理switch语句,我认为从字典中查找内容类型更简洁:

var contentTypesByExtension = {
    'html': "text/html",
    'js':   "text/javascript"
};

...

    var contentType = contentTypesByExtension[fileExtension] || 'text/plain';

你不需要快递。你不需要联系。Node.js执行http native。你所需要做的就是根据请求返回一个文件:

var http = require('http')
var url = require('url')
var fs = require('fs')

http.createServer(function (request, response) {
    var requestUrl = url.parse(request.url)    
    response.writeHead(200)
    fs.createReadStream(requestUrl.pathname).pipe(response)  // do NOT use fs's sync methods ANYWHERE on production (e.g readFileSync) 
}).listen(9615)    

一个更完整的例子,确保请求不能访问基目录下的文件,并进行适当的错误处理:

var http = require('http')
var url = require('url')
var fs = require('fs')
var path = require('path')
var baseDirectory = __dirname   // or whatever base directory you want

var port = 9615

http.createServer(function (request, response) {
    try {
        var requestUrl = url.parse(request.url)

        // need to use path.normalize so people can't access directories underneath baseDirectory
        var fsPath = baseDirectory+path.normalize(requestUrl.pathname)

        var fileStream = fs.createReadStream(fsPath)
        fileStream.pipe(response)
        fileStream.on('open', function() {
             response.writeHead(200)
        })
        fileStream.on('error',function(e) {
             response.writeHead(404)     // assume the file doesn't exist
             response.end()
        })
   } catch(e) {
        response.writeHead(500)
        response.end()     // end the response so browsers don't hang
        console.log(e.stack)
   }
}).listen(port)

console.log("listening on port "+port)

如果你的电脑上安装了节点,你可能有NPM,如果你不需要NodeJS的东西,你可以使用服务包来实现这个:

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

npm install -g serve

2 -提供静态文件夹:

serve <path> 
d:> serve d:\StaticSite

它会告诉你你的静态文件夹正在被服务的端口,只需像这样导航到主机:

http://localhost:3000

Local-web-server绝对值得一看!以下是自述的节选:

本地web服务器

一个精简的、模块化的web服务器,用于快速的全栈开发。

支持HTTP、HTTPS和HTTP2。 体积小,100%个性化。只加载和使用项目所需的行为。 附加一个自定义视图以个性化活动的可视化方式。 编程和命令行接口。

使用此工具:

构建任何类型的前端web应用程序(静态,动态,单页应用程序,渐进式web应用程序,React等)。 原型后端服务(REST API,微服务,websocket,服务器发送事件服务等)。 监控活动,分析性能,试验缓存策略等。

Local-web-server是一个lws发行版,它与一个有用的中间件“入门包”捆绑在一起。

剧情简介

这个包安装ws命令行工具(请参阅使用指南)。

静态网站

不带任何参数地运行ws将把当前目录作为一个静态网站托管。导航到服务器将呈现一个目录列表或您的index.html,如果该文件存在的话。

$ ws
Listening on http://mbp.local:8000, http://127.0.0.1:8000, http://192.168.0.100:8000

静态文件教程。

这个片段演示了静态托管和两个日志输出格式-开发和统计。

单页应用

为单页应用程序(一个带有客户端路由的应用程序,例如React或Angular应用程序)提供服务就像指定单页的名称一样简单:

$ ws --spa index.html

对于静态站点,对典型SPA路径(例如/user/1, /login)的请求将返回404 Not Found,因为该位置的文件不存在。然而,通过将index.html标记为SPA,你创建了以下规则:

如果一个静态文件被请求(例如/css/style.css),那么服务它,如果没有(例如/login),那么服务指定的SPA并处理路由客户端。

SPA教程。

URL重写和代理请求

另一个常见的用例是将某些请求转发到远程服务器。

下面的命令将博客帖子请求从任何以/posts/开头的路径代理到https://jsonplaceholder.typicode.com/posts/。例如,对/posts/1的请求将被代理到https://jsonplaceholder.typicode.com/posts/1。

$ ws --rewrite '/posts/(.*) -> https://jsonplaceholder.typicode.com/posts/$1'

重写教程。

这个片段演示了上面加上——static的用法。Extensions用于指定默认文件扩展名,——verbose用于监视活动。

HTTPS和HTTP2

对于HTTPS或HTTP2,分别传递——HTTPS或——HTTP2标志。请参阅wiki以获得进一步的配置选项和如何在浏览器中获得“绿色挂锁”的指南。

$ lws --http2
Listening at https://mba4.local:8000, https://127.0.0.1:8000, https://192.168.0.200:8000

对于简单的nodejs服务器,已经有一些很好的解决方案。 如果你在修改文件时需要实时重新加载,还有一个解决方案。

npm install lite-server -g

导航您的目录并执行

lite-server

它将打开浏览器为您实时重新加载。