node.js创建静态web服务过程(没用框架)

主要介绍搭建静态web服务得一个过程

目录

  1. 什么是Node.js
  2. 安装node
  3. node.js得http模块 url模块 以及supervisor自动启动服务插件
  4. node模块:核心模块,文件模块
  5. 第三方模块、插件得应用
  6. fs文件模块
  7. 封装一个静态WEB服务器
  8. 路由
  9. ejs后端模板渲染引擎
    10.get post方法

1.什么是Node.js

node.js是javascript语言得服务器运行环境,提供了大量得工具库,使得javascript可以调用操作系统级别得api,
node.js内部采用谷歌得v8引擎来作为javascript得语言解释器。
node.js基础事件驱动和异步I/O得服务端运行环境

免费得学习资源
https://www.itying.com/goods-240.html
找了个最新比较全得
https://www.bilibili.com/video/av38925557/?p=1

2.安装node

官网找下 ,安装,执行node -v 出来版本号就可以了,这比较简单就不说了。
vscode node语法提示插件node-snippets
node启动文件  node app.js

3.node.js得http模块 url模块 以及supervisor自动启动服务插件

http :http请求
url:解析url

// 引入http模块请求  内置模块
const { log } = require("console");
const http = require("http");
const url = require("url");
/*
    创建一个web服务
    request获取请求信息
    response 响应信息
*/
http.createServer(function (request, response) {
    response.writeHead(200, { "Content-Type": "text/html;charser='utf-8'" });
    // 给我们页面输出一句话,并且结束响应  write 不能中文需要输入html 中头部片段,可是输入html 片段
    response.write("<head><meta charset='utf-8'></head>");
    response.write("中文乱码aaaa<br>");

    /*
        设置响应头  request.url获取参数  http://127.0.0.1:8088/?aa=10&name=yangjie
        解析字符串
        parse true 处理 里面得字符串
    */
    if (request.url != "/favicon.ico") {
        let pa = url.parse(request.url, true);
        console.log(pa);
    }

    response.end("param1111");
}).listen(8088); //监听得端口

supervisor自动启动插件

npm i supervisor -g 全局安装
supervisor XXX.js

4.node模块:核心模块,文件模块

核心模块,文件模块 又称系统模块和自定义模块
如何自定义一个模块,其实很简单,就是建一个js ,引入并且使用其方法,exports module_exports,这里跟vue 差不多,不多讲了。通过require来引入。

这里注意讲下如果是引入得文件在node_modules文件夹下require(“axios”) 会自动去node_modules里面找axios文件夹中得index.js,(如果引入其他名字得文件,需要npm init --yes 自动生成package.json来配置入口文件)–yes强制生成

5.第三方模块、插件得应用

第三方包目录得规范 npm 下载 找包https://www.npmjs.com
package.json:描述文件
bin:存放可执行得二进制文件
lib:存放javascript代码目录
doc:存放文档得目录

根目录生成package.json npm init
Npm 下载包,这个跟vue里完全一样不讲了。

6.fs文件模块
fs是node得内置模块,对文件得一些处理,都是异步得方法 ./ 都是以当前启动的那个文件目录为准

/*
    文件模块
    fs.stat  检测是文件还是目录
    fs.mkdir 创建目录
    fs.writeFile  创建写入文件
    fs.appendFile 追加文件
    fs.readFile  读取文件
    fs.readdir   读取目录
    fs.rename    重命名
    fs.rmdir    删除目录
    fs.unlink    删除文件
    fs.createReadStream    从文件流读取
    fs.createWriteStream    写入文件
    管道流
*/

const fs = require("fs");

fs.stat("../node_modules", (err, data) => {
    if (err) {
        console.log(err);
        return;
    }
    // data.isFile() 判断是否是文件
    console.log(data.isFile(), "是文件");
});

// 创建目录 目录存在会报错直接返回
fs.mkdir("./css", (err) => {
    if (err) {
        console.log(err);
        return;
    }
    console.log("创建目录");
});

// 写入文件  文件存在会替换 不存在就创建
fs.writeFile("./css/index.css", "这是一个css", (err) => {
    if (err) {
        console.log(err);
        return;
    }
    console.log("写入文件");
});

// 写入文件  文件存在会追加 不存在就创建
fs.appendFile("./css/zhujia.css", "追加点东西", (err) => {
    if (err) {
        console.log(err);
        return;
    }
    console.log("写入文件");
});

// 读取文件
fs.readFile("./css/zhujia.css", (err, data) => {
    if (err) {
        console.log(err);
        return;
    }
    // data 十六进制文件 buffer
    console.log(data.toString());
    console.log("读取文件");
});

// 读取目录
fs.readdir("./css", (err, data) => {
    if (err) {
        console.log(err);
        return;
    }
    // 当前目录下所有得文件和目录
    console.log(data);
    console.log("读取目录");
});

// 重命名   功能 1.重命名  2.移动文件
fs.rename("./css/aaa.css", "./newCss/index.css", (err) => {
    if (err) {
        console.log(err);
        return;
    }
    // 当前目录下所有得文件和目录
    console.log("重命名");
});

// 删除目录  目录里面不能有东西
fs.rmdir("./css", (err) => {
    if (err) {
        console.log(err);
        return;
    }
    // 当前目录下所有得文件和目录
    console.log("删除目录");
});

// 删除文件
fs.unlink("./css/aaa.css", (err) => {
    if (err) {
        console.log(err);
        return;
    }
    // 当前目录下所有得文件和目录
    console.log("删除文件");
});

// fs.createReadStream    从文件流读取
var readStream = fs.createReadStream("./data/input.text");
let str = "";
let count = 0;
readStream.on("data", (data) => {
    str += data;
    count++;
});

readStream.on("error", (error) => {
    console.log(error);
});

readStream.on("end", (data) => {
    console.log(str, count);
});
// fs.createWriteStream    写入文件
let strWrite = "";
for (let i = 0; i < 1000; i++) {
    strWrite += "这是要存起来得数据!111111";
}

let writeStream = fs.createWriteStream("./data/out.text");
// writeStream.write(strWrite);
// // 监听写入完成
// writeStream.end();
// writeStream.on("finish", () => {
//     console.log("完成");
// });

// 管道流,从一个流读取数据  放到另一个流中
readStream.pipe(writeStream);

7.封装一个静态WEB服务器

1.创建一个Node http server
2.写一个同步的方法,根据不同的文件后缀,替换不同的Content-Type
mime.json 可以网上查下
3.根据url读取对应的文件
res.write(str)

目录结构
在这里插入图片描述
static中的静态页面 自己随便整整
http.js 封装一个run方法


var http = require("http");
const { run } = require("./run");
http.createServer(function (reg, res) {
    run(reg, res);
}).listen(8081);

console.log("Server running at http://127.0.0.1:8081/");


run()

const url = require("url");
const fs = require("fs");
const path = require("path");
let commond = require("./commond");

let baseUrlFile = "./static";
// 根据文件后缀 获取Content-Type
exports.run = async (reg, res) => {
    // 获取参数
    if (reg.url == "/favicon.ico") {
        return;
    }

    // 获取文件名后缀 处理text/html
    let mime = path.extname(reg.url) || ".html";
    // console.log(commond.getFileMime(mime), mime);
    res.writeHead(200, {
        "Content-Type": commond.getFileMime(mime) + ';charset="utf-8"',
    });

    // 获取url路径  没有的话 给默认
    let thisPath = url.parse(reg.url, true).path;
    let newPath = !thisPath || thisPath == "/" ? "/index.html" : thisPath;
    // 读取文件
    let str = commond.read(newPath, baseUrlFile);

    res.write(str);
    res.end();
};

commond方法

let fs = require("fs");
// 根据文件后缀 获取Content-Type
exports.getFileMime = (extname) => {
    // 同步方法
    let data = fs.readFileSync("./utils/mime.json");
    let mimeObj = JSON.parse(data.toString());
    return mimeObj[extname];
};

// 读取页面
exports.read = (url, baseUrlFile) => {
    let data;
	try {
	        data = fs.readFileSync(baseUrlFile + url);
	        return data;
	    } catch (error) {
	        data = "页面不存在 404";
	        return data;
	    }
	 
	};
	

这样就可以了

8.路由

什么是路由:就是针对不同的url处理不同的业务逻辑,跟vue-router差不多也是定义一批url 和 页面之间的关系
在上面的commond中read方法改一下

let data;
    try {
        data = fs.readFileSync(baseUrlFile + url);
        return data;
    } catch (error) {
        data = null;
        return data;
    }

在上面的run.js中改下

顶部,新建一个router.js
const { router } = require("./router");
27行
if (str) {
        res.write(str);
        res.end();
    } else {
        // 走路由
        router(res, thisPath);
    }

router.js

// 根据文件后缀 获取Content-Type
let { readEjs } = require("./commond");
exports.router = async (res, thisPath) => {
    // 走路由
    let str =
        (await readEjs("./ejsView" + thisPath + ".ejs", {
            message: "这是动态的EJS数据",
        })) || "找不到EJS";
    if (thisPath == "/login") {
        res.end(str);
    } else {
        res.end("404 找不到页面");
    }
};

9.ejs后端模板渲染引擎
这里怎么用可以看文档
上面router.js中用来EJS
结构增加
在这里插入图片描述

在commond中加入readEjs方法

// 读取ejs页面
exports.readEjs = (url, datas) => {
    return new Promise((resolve, reject) => {
        ejs.renderFile(url, datas, (err, data) => {
            if (err) {
                resolve(null);
            }
            resolve(data);
        });
    });
};

10.get post方法

get方法就是通过url 拼接数据

let param = url.parse(reg.url, true).query;

post 数据接受 post数据是通过流的方式传递的 需要通过流的方式读取

怎么发出psot请求,可以在上面的ejs文件种写个post请求或者 form表单提交,写的请求地址其实就是我们对应的路由,比如./submitData 那么我们在路由种可以做处理 接受数据来
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值