Node.js
- stream流
Stream 是一个抽象接口,Node 中有很多对象实现了这个接口。例如,对http 服务器发起请求request 对象就是一个 Stream,还有stdout(标准输出)。
Node.js,Stream 有四种流类型:
Readable - 可读操作。
Writable - 可写操作。
Duplex - 可读可写操作.
Transform - 操作被写入数据,然后读出结果。
所有的 Stream 对象都是 EventEmitter 的实例。常用的事件有:
data - 当有数据可读时触发。
end - 没有更多的数据可读时触发。
error - 在接收和写入过程中发生错误时触发。
finish - 所有数据已被写入到底层系统时触发。
从流中读取数据
//从流中读取数据
const fs=require("fs");
//设置读取的数据
let data="";
// 创建流
let readStream=fs.createReadStream("content.txt");
//设置编码格式
readStream.setEncoding("UTF-8");
//处理流的事件
//当有数据可读时触发
readStream.on("data",function (res){
data+=res;
});
//没有数据可读时触发
readStream.on("end",function (){
console.log(data);
});
//在读取时发生错误时触发
readStream.on("error",function (err){
console.log(err);
});
console.log("读取完成");
写入流
//创建写入流
let text="我在给文件写字";
let writerStream=fs.createWriteStream("content.txt");
//设置写入的编码
//在这里可以不断的写入文件
writerStream.write(text,"UTF-8");
//写入完成
writerStream.end();
//监听事件
writerStream.on("finish",function (){
console.log("写入完成");
});
管道流
//管道流 意思是读取流直接到写入流
// 创建流
var readStream1=fs.createReadStream("content.txt");
var writerStream1=fs.createWriteStream("data.txt");
readStream1.pipe(writerStream1);
- 回调函数处理异步 (非阻塞)
var fs=require("fs");
//阻塞请求数据 等待请求完成在执行后续代码
var data=fs.readFileSync("mime.json");
console.log(data.toString());
// 非阻塞式请求代码 nodejs中多数方法为异步请求方式
fs.readFile("mime.json",function (err,res){
if(err) throw err;
console.log(res.toString());
});
console.log(1);
//处理异步请求 外边可以获取到请求的数据的方式
//1.使用回调函数来获取数据
function getMime(callback){
fs.readFile("mime.json",function (err,res){
if(err) throw err;
callback(res.toString());
});
}
console.log(1);
//这样就可以在外部获取异步的数据 也可以暴露出去别的文件使用
module.exports=getMime(function (data){
console.log(data);
});
Node.js的事件驱动
module.exports=(eventemit)=>{
//监听事件驱动
//监听的过程
let getdatafun=()=>{
console.log("事件触发1");
}
eventemit.on("getdata",getdatafun);
eventemit.on("getdata",getdatafun);
//事件驱动里面的方法
eventemit.addListener("getjson",()=>{
console.log("getjson 监听函数触发");
});
eventemit.addListener("getstu",()=>{
console.log("getstu 监听函数触发");
});
//once 一次性监听
eventemit.once("getsome",()=>{
console.log("getsome 监听函数执行");
//removeListener 移除事件监听
//eventemit.removeListener("getdata",getdatafun);
//removeAllListeners 当前制定事件全部移除 不带参数所有监听器全部移除
//eventemit.removeAllListeners();
//listeners 返回当前监听器的数组
let es=eventemit.listeners("getdata");
console.log(es);
});
}
- Node.js简单路由配置
var http=require("http");
var url=require("url");
http.createServer(function (req,res){
var path=url.parse(req.url,true).pathname;
if(path=="/")
{
res.end("index.html");
}
else if(path=="/login")
{
res.end("login.html");
}
else{
res.end("regest.html");
}
}).listen(8100);
- get/post传值
Get 传值直接是在url的后边传值 (不安全) 获取get传值的方法是url模块解析路径获取传值;
POST获取值 是通过监听事件来获取数据
//node 路由配置 get(路由) post(表单提交用的)
const url = require("url");
const ejs = require("ejs");
let data = require("./data.json");
module.exports = (req, res) => {
res.writeHead(200, { "Content-Type": "text/html;charset=utf-8" });
let pathname = url.parse(req.url).pathname;
if (pathname != "/favicon.ico") {
if (pathname == "/") {
ejs.renderFile("view/index.ejs", {
student: data
}, (err, str) => {
if (err) {
throw err;
}
res.end(str);
});
}
else if (pathname == "/login") {
ejs.renderFile("view/login.ejs", {
student: data
}, (err, str) => {
if (err) {
throw err;
}
res.end(str);
});
}
else if (pathname == "/regest") {
//get传值使用url解析模块 获取get 传值
let path = url.parse(req.url, true);
let getdata = path.query;
ejs.renderFile("view/regest.ejs", {
student: data,
urldata: getdata
}, (err, str) => {
if (err) {
throw err;
}
res.end(str);
});
}
else if (pathname == "/dologin") {
//登录
//post传值
let info = "?";
req.on("data", (res) => { //res buff
info += res.toString();
});
req.on("end", () => {
let postdata = url.parse(info, true).query;
ejs.renderFile("view/index.ejs", {
student: data,
postdata: postdata
}, (err, str) => {
if (err) {
throw err;
}
res.end(str);
});
});
}
else {
//404
ejs.render("404.ejs", data);
res.end();
}
}
}
- EJS模板引擎
使用的模板引擎 ejs模板 https://ejs.bootcss.com/
安装ejs cnpm install ejs --save-dev
include 引入模板 - EJS标签
<% ‘脚本’ 标签,用于流程控制,无输出。
<%_ 删除其前面的空格符
<%= 输出数据到模板(输出是转义 HTML 标签)
<%- 输出非转义的数据到模板
<%# 注释标签,不执行、不输出内容
<%% 输出字符串 ‘<%’
%> 一般结束标签
-%> 删除紧随其后的换行符
_%> 将结束标签后面的空格符删除