Node.js搭建本地静态服务器

Node.js搭建本地静态服务器

了解网络

HTTP(超文本传输协议)

主要内容
请求
请求头
请求体
响应
响应头
响应体
连接(三次握手)
断开(四次挥手)

基于Node.js静态服务器

url模块

  • url是node.js的内建模块
  • url模块中最重要的方法是parse()方法,用于将url字符串解析成为对象
  • 基础语法:url.parse(url:string);

举例_url

var http = require('http');
var url = require('url');
//url为node.js中的内置模块,主要用于解析或者封装url地址
var server = http.createServer(function (req, res) {
    console.log(url.parse('http://localhost:4000/img.jpg'));
});

server.listen(4000, function () {
    console.log('server is running at 4000 666');
});
$ node index.js
server is running at 4000 666
Url {
  protocol: 'http:',
  slashes: true,
  auth: null,
  host: 'localhost:4000',
  port: '4000',
  hostname: 'localhost',
  hash: null,
  search: null,
  query: null,
  pathname: '/img.jpg',
  path: '/img.jpg',
  href: 'http://localhost:4000/img.jpg' }

举例_fs

fs模块:fs->files system缩写
fs.readFile(); 读取文件内容
fs.state(); 读取文件状态

index.js

var fs = require('fs');
fs.readFile('./test.txt', function(error,data) {
    if(error){
        console.log(error);
    }else {
        console.log(data.toString());
    }
});

输出

$ node index.js
server is running at 4000 666
这是一个txt文本文件

返回对应的页面

var server = http.createServer(function (req, res) {
    // 得到用户访问了哪个地址
    var path = '.'+url.parse(req.url).pathname;
    // 发送用户访问了哪个网址
    fs.readFile(path, function(err, data) {
        if(err){
            console.log(err);
        }else{
            var html = data.toString();
            res.end(html);
        }
    });
});

url.parse(req.url).pathname 会解析到对应的路径

js.stat文件状态

fs.stat('public/test.txt', function (err,stat) {
    if(err){
        console.log(err);
    }else{
        console.log(stat);
    }
});
$ node index.js
server is running at 4000 厉害了
{ dev: 535335,
  mode: 33206,
  nlink: 1,
  uid: 0,
  gid: 0,
  rdev: 0,
  blksize: undefined,
  ino: 1407374883560421,
  size: 29,
  blocks: undefined,
  atime: 2017-02-14T01:50:56.535Z,
  mtime: 2017-02-14T02:20:15.197Z,
  ctime: 2017-02-14T02:51:00.394Z,
  birthtime: 2017-02-14T01:50:56.535Z }
这是一个txt文本文件

注意:fs.stat会先于fs.readFile执行。显示了异步执行。

综合应用:

var server = http.createServer(function (req, res) {
    // 得到用户访问了哪个地址
    var path = './public'+url.parse(req.url).pathname;
    fs.stat(path, function (err, stat) {
        if(!stat){
            // 如果访问的文件不存在,则进入分支
            fs.readFile("./public/404.html", function(err,data) {
                var html = data.toString();
                res.end(html);
            });
        }else{
            // 发送用户访问了哪个网址
            fs.readFile(path, function(err, data) {
                    var html = data.toString();
                    res.end(html);
            });
        }
    });
});

MIME信息

添加之后

var path = require('path');//处理一些文件目录、路径一类的信息
var MIME = {
    html:'text/html',
    css:'text/css'
}

发送内容的代码

var server = http.createServer(function (req, res) {
    // 得到用户访问了哪个地址
    var pathname = './public'+url.parse(req.url).pathname;
    fs.stat(pathname, function (err, stat) {
        if(!stat){
            // 如果访问的文件不存在,则进入分支
            fs.readFile("./public/404.html", function(err,data) {
                if(err){
                    console.log(err);
                }else{
                    var html = data.toString();
                    res.end(html);
                }
            });
        }else{
            // 发送用户访问了哪个网址
            fs.readFile(pathname, function(err, data) {
                if(err){
                    console.log(err);
                }else{
                    var html = data.toString();
                    var extname = (path.extname(pathname)).split('.')[1];
                    res.writeHead(200,{"Content-Type":MIME[extname]});
                    res.end(html);
                }
            });
        }
    });
});

修改,可以传图片

var MIME = {
    "":"text/html",
    html:'text/html',
    css:'text/css',
    jpg:"image/jpeg",
    png:"image/png",
    ico:"image/x-icon"
}

var server = http.createServer(function (req, res) {
    // 得到用户访问了哪个地址
    var pathname = './public'+url.parse(req.url).pathname;
    fs.stat(pathname, function (err, stat) {
        if(!stat){
            // 如果访问的文件不存在,则进入分支
            fs.readFile("./public/404.html", function(err,data) {
                if(err){
                    console.log("stat readFile" + err);
                }else{
                    var extname = (path.extname(pathname)).split('.')[1];
                    res.writeHead(200,{"Content-Type":MIME[extname]});
                    res.write(data);
                    res.end();
                }
            });
        }else{
            // 发送用户访问了哪个网址
            fs.readFile(pathname, function(err, data) {
                //访问根目录,就进入index.html
                if(err){
                    fs.readFile("./public/index.html", function(err,data) {
                        if(err){
                            console.log("stat readFile" + err);
                        }else{
                            //1.不能转字符串
                            //2.不用end转
                            var extname = (path.extname(pathname)).split('.')[1];
                            res.writeHead(200,{"Content-Type":MIME[extname]});
                            res.write(data);
                            res.end();
                        }
                    });
                }else{
                    var extname = (path.extname(pathname)).split('.')[1];
                    res.writeHead(200,{"Content-Type":MIME[extname]});
                    res.write(data);
                    res.end();
                }
            });
        }
    });
});

页面修改

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>网页</title>
        <link rel="stylesheet" href="./css/style.css">
    </head>
    <body>
        <h1>这是HTML网页</h1>
        <h2>OK,没毛病</h2>
        <img src="./img/01.png" alt="">
    </body>
</html>
运行即可查看网页看到效果
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 个人入门学习用笔记、不过多作为参考依据。如有错误欢迎斧正 目录 简书好像不支持锚点、复制搜索(反正也是写给我自己看...
    kirito_song阅读 2,505评论 1 37
  • Node.js是目前非常火热的技术,但是它的诞生经历却很奇特。 众所周知,在Netscape设计出JavaScri...
    w_zhuan阅读 3,642评论 2 41
  • 模块化公布自己的模块功能. 其他模块调用另外的模块. 公布方法 如果要输出一个键值对象{},可以利用exports...
    httIsHere阅读 536评论 0 0
  • topics: 1.The Node.js philosophy 2.The reactor pattern 3....
    宫若石阅读 1,126评论 0 1
  • 二十、Node.js 原文:Node.js译者:飞龙协议:CC BY-NC-SA 4.0自豪地采用谷歌翻译部分参考...
    布客飞龙阅读 1,164评论 2 18