一 创建web静态服务器
- localhost:8000,直接访问静态网站的首页,处理服务两次响应。
当路径是localhost:8000,默认加载首页; - 可以将之前自己写的H5+C3的静态页面加载上去,看浏览器加载情况,注意要转到汉字符号。
二 nodejs里面的非阻塞io和阻塞IO
- 非阻塞io:异步读取。其他后端语言会使用多线程,而nodejs是单线程,优势是非阻塞io:一个服务员满足多个客户的需求(没有多线程),比如多个文件读取;
- 阻塞IO:同步读取,一个读取完成等待下一个;
fs.readFileSync('stu.txt')//同步代码 阻塞io
- 引入事件驱动模块:
let events = require('events');
- 创建事件驱动对象:
let eventEmit = new events.EventEmitter();
new 完对象之后就可以使用on(监听订阅)(先监听)、emit(发布订阅)(后发布) ;
- 非阻塞,使用回调函数处理异步:
function getData(callback) {
fs.readFile('stu.txt', (err, data) => {
if (err) {
throw err;
}
callback(data.toString());
});
}
- 使用node的事件驱动 来监听events。事件驱动的监听和vue里面 事件车 :$emit、 $on 是一个东西:
fs.readFile('stu.txt', (err, data) => {
if (err) {
throw err;
}
//发布订阅
eventEmit.emit('mydata', data);
});
eventEmit.on('mydata', (result) => {
console.log(result.toString(), 1);
});
- 使用es6 处理:promise
let promise = new Promise((resolve, reject) => {
fs.readFile('stu.txt', (err, data) => {
if (err) {
throw err;
}
resolve(data);
});
});
promise.then((result) => {
console.log("promise", result.toString());
});
- es7 ::async
async function getResult() {
try {
let data = await new Promise((resolve, reject) => {
fs.readFile('stu.txt', (err, data) => {
if (err) {
throw err;
}
resolve(data);
});
});
return data;
}
catch (e) {
throw e;
}
}
getResult().then((result) => {
console.log("async", result.toString());
});
三 路由
- 对路径进行解析 获取pathname 这样可避免get传值之类:
var pathname = url.parse(req.url, true).pathname;
- 简单路由的配置:
module.exports = (req, res) => {
res.writeHead(200, { "Content-Type": "text/html;charset=UTF-8" });
var pathname = url.parse(req.url, true).pathname;
//把无效的请求过滤
if (pathname != "/favicon.ico") {
if (pathname == "/") {
// pathname = "index.html";//默认
res.end("index.html");
}
//模拟简单路由的配置
if (pathname == "/login") {
res.end("login.html");
}
if(pathname=="/regest")
{
res.end("regest.html");
}
}
}
- ejs 模板引擎,相当于服务器端的html
安装:cnpm install --save-dev ejs - node 路由的get 、 post 传值。get传值不安全,可以通过路径解析获得:
let query = path.query;
而post 传值通过事件的监听获取;
let info = "?";
req.on("data", (data) => {
info += data;
});
req.on("end", () => {
//输出的info ?userid=admin&userpwd=12345
console.log(url.parse(info, true).query); //{ userid: 'admin', userpwd: '12345' }
ejs.renderFile("view/index.ejs", (err, str) => {
if (err) {
throw err;
}
res.end(str);
});
});