Node.js
学习网站:
(https://www.bilibili.com/video/av16249662/?p=15)
http模块
使用是使用
var http=require("http");
http.createServer(function(req,res){
console.log("人来了");
}).listen(8080)
req.url表示请求的地址
文件操作fs
fs读文件
fs.read('文件名',function(err,data){
if(err){
console.log("wrong");
}
else(
res.write(data);
console.log(data.toString());
)
})
通过url读写文件
代码如下:
var fs=require("fs");
http.createServer(function (req, res) {
var file=req.url.split('/');
fs.readFile(file[1],function(err,data){
if(err){
res.end("wrong 404");
console.log(req.url);
console.log(file[1])
}
else{
res.write(data);
}
})
}).listen(8080);
Get方式获取数据
数据在url中,通过url获取数据。
querystring模块可以对数据部分进行解析,但不够方便。(因为需要先解析出数据部分)。
js代码如下所示:
const http = require('http');
const urllib=require('url');
http.createServer(function (req, res) {
var obj=urllib.parse(req.url,true);
var url=obj.pathname;
var GET=obj.query;
console.log(url);
console.log("shdasdas");
console.log(req.url)
console.log(GET,url.pathname);
res.write('522543245');
res.end();
}).listen(8080);
引入url模块,它能解析url请求,其中的query和pathname就是我们需要的内容
html代码如下所示:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<form action="http://localhost:8080" method="GET">
<input type="text" name="user">
<input type="password" name="pass">
<input type="submit" value="提交">
</form>
</body>
</html>
对于Get请求,一般使用url模块进行解析。
Post数据
post数据比get数据大得多,所以可能会分多次发送。
data —一段数据到达
end — 全部到达
代码如下
var http=require("http");
http.createServer(function(req,res){
var str='sfds';//接受数据
req.on('data',function(data){
str=str+data;
});//触发事件
req.on('end',function(){
console.log(str);
})
res.end("Yes");
}).listen(8080);
模块化
- require ------引入其他模块
- exports -------单个输出
- module -------批量输出
- .js是可选的
- npm:NodeJsPackage(NodeJs管理器)
npm
- 统一下载途径
- 自动下载依赖
如何下载模块:
npm install xxx(模块名) 在cmd中运行即可下载模块。
Express
方法
- get(’/’,functioa(req.rres){});
- post(’/+url’,function(req,res){});
- ues(’/+url’,function(req,res){});
ues方法可以代替get和post方法
url.query可以解析Get数据。
url.body解析的是Post数据,需要先用server.use(bodyparser.urlencoded({}))处理。
代码示例:
var express=require("express");
var server=expres();
server.use('/1.html',function(req,res){
res.send("hello 1.html");
res.end();
})
server.use('2.html',function(req,res){
res.send("hello 2.html");
res.end();
})
server.listen(8080);
在express框架中,读写文件操作没有改变。也可以使用中间件express-static读文件。
fs读文件:
var express=require("express");
var http=require("http");
var fs=require("fs");
var server=express();
server.use('/1.html',function(req,res){
fs.readFile("1.html",function(err,data){
if(err){
res.send("wrong");
}
else{
res.send(data);
}
res.end();
})
})
server.listen(8080);
中间件express-static读文件:
var express=require("express");
var http=require("http");
var fs=require("fs");
var expressStatic=require("express-static");//引入中间件
var server=express();
server.use(expressStatic("x"));//x代表文件夹名;不能直接给文件名;在url中给出文件名,就可以访问该文件。
server.listen(8080);
body-parser处理数据:
需要先用server.use(bodyparser.urlencoded({}))处理
var express=require("express");
var expressStatic=require("express-static");
var bodyParser=require('body-parser');
var server=express();
server.listen(8080);
server.use(bodyParser.urlencoded({}));
server.use('/',function(req,res){
console.log(req.body);
})
urlencoded({})中的参数:
extended: 值位ture时就是扩展模式,为false时就是非扩展模式。
limit: 默认是100k,以k为单位。
链式操作
server.use('/',function(req,res,next){
console.log("b");
next();
})//该语句构成链式操作
cookie
在浏览器保存一些数据,每次向服务器请求时都会带上。不安全。大小有限(4k)。
-
读取 需要cookie-parser
var express=require("express"); var cookieparser=require("cookie-parser");//引入cookie-parser模块 var server=express(); server.use(cookieparser());//先处理,再使用。 server.use('/aaa',function(req,res){ console.log(req.cookies); res.send("OK"); }) server.listen(8080);
-
写cookie:
var express=require("express"); var server=express(); server.use('/',function(req,res){ res.cookie('user','blue',{path:'/aaa',maxAge:30*24*3600*1000}); res.send("OK"); }) server.listen(8080);
res.cookie(‘名称’,‘值’,{path:‘路径’,maxAge:保存时间(以毫秒为单位)});
给cookie签名:作用是防止cookie被改。
req.secret='字符串';
res.cookie("值":"属性",{singed:true});
删除cookie:
server.use(cookieparser());//先处理,再使用。
server.use('/aaa',function(req,res){
res.clearCookie('名称');
res.send("OK");
})
session
保存在服务端,大小无限(与服务器有关)。比cookie安全。
- 读取 需要cookie-session
- 需要先解析cookie
- keys数组越长越安全
- delete 删除session
示例代码:
var express=require("express");
var cookieparser=require("cookie-parser");
var cookiesession=require("cookie-session");//引入中间件
var server=express();
server.use(cookieparser());
server.use(cookiesession({
name:'blue',
keys:["aaa","bbb","ccc"],//必须设置keys数组,否则报错。
maxAge:2*3600*1000
}));
server.use('/',function(req,res){
if(req.session['count']==null){
req.session['count']=1;
}else{
req.session['count']++;
}
console.log(req.session['count']);
res.send("OK");
})
server.listen(8080);
模板引擎
jade -------破坏式 侵入式
根据缩进确定层级关系
var jade=require("jade");
var str=jade.render('html');//渲染成html格式
console.log(str);
渲染jade文件:
var jade=require("jade");
var str=jade.renderFile('1.jade',{pretty:true});//需要加{prett:ture}形成html格式
console.log(str);
jade文件样式:
html
header
style
script
body
div
ul
li
li
li
div
ejs ---------非破坏式
var ejs=require("ejs");
ejs.renderFile('1.ejs',{name:'blue'},function(err,data){
if(err){
console.log("失败");
}
else{
console.log(data);
}
})
ejs样式:
我的名字:<%= name %>
route路径
router.use()
router.get()
router.post()
据此可以实现对不同路径下文件的访问,拆解服务(子服务)。
var router=express.Router();
servcer.ues('/',router);//向‘/’路径下添加router
代码示例:
var express=require("express")
var server=express();
server.listen(8080);
var router=express.Router();
router.get('/1.html',function(req,res){
res.send("hello");
})
router.get('/2.html',function(req,res){
res.send('kkkkk');
})
server.use('/',router);//在‘/’路径下访问1.html或2.html
数据库
sql命令尽量使用大写
增 ——INSERT
删 ——DELETE
改 ——UPDATAE
查 —— SELECT
查的代码示例:
var mysql=require('mysql');
var db=mysql.createConnection({host:'localhost',
user:'root',password:'123456',database:'20190930'});
db.query("select * from usertable;",(err,data)=>{
if(err){
console.log("失败",err);
}
else{
console.log("成功了\n",data);
}
});