nodejs Express框架
npm install --save express
--save 表示自动修改 pakage.json
var express = require("express");
var app = express();
app.get("/",function(req,res){
res.sed("nihao");
})
app.get("/haha",function(req,res){
res.sed("这是haha页面");
})
app.get(/^/student/([d]{10})$/,function(req,res){
res.send("学生信息,学号" + req.params[0]);
});
app.get("/teacher/:gonghao",function(req,res){
res.send("老师信息,工号" + req.params.gonghao]);
})
app.listen(3000);
静态文件处理
var express = require("express");
var app = express();
app.use(express.static("./public"));
app.get("/haha",function(req,res){
res.send("haha");
});
app.listen(3000);
Express 模板引擎 haha.ejs
var express = require("express");
var app = express();
app.set("view engine","ejs");
app.get("/",function(req,res){
res.render("haha",{
"news":["我是小新闻啊","我也是啊","哈哈哈哈"]
})
})
app.listen(3000);
路由Router
正则表达式中,未知部分用圆括号分组,然后可以用
req.params[0], [1] 得到 req.params 类数组对象。
:是更推荐的东西
app.get("网址",function(req,res){
});
app.get(/^/student/([d]{10})$/,function(req,res){
res.send("学生信息,学号" + req.params[0]);
});
app.get("/student/:id",function(req,res){
var id = req.params["id"];
var reg = /^[d]{6}$/;
if(reg.test(id)){
res.send(id);
}else{
res.send("请检查格式");
}
});
app.get("/:username/:oid",function(req,res){
var username = req.params["username"];
var oid = req.params["oid"];
ren.write("username");
ren.end("oid");
})
app.post("网址",function(req,res){
});
如果想处理这个网址的任何method请求,那么写 all
app.all()
router 案例,restful路由设计
var express = require("express");
var app = express();
//设置模板引擎
app.set("view engin","ejs"); //.ejs模板
app.get("/",function(req,res){
res.render("form");
});
app.post("/",function(req,res){
//将数据添加进入数据库
res.render("成功");
});
app.listen(3000);
中间件(水流从上往下流动) 如果get post 没有 next参数, 那么就匹配到第一个路由就不往下匹配了。
下面两个路由看似没有关系,但是实际上冲突了,匹配到第一个就不会往下匹配了
1.更换位置
2.next()
3.use() 中间件, 他的网址不是精确匹配,而是拓展。
var express = require("express");
var app = express();
var a = 100;
app.get("/:username/:id",function(req,res,next){
var username = req.params.username;
//检索数据库,如果username不存在,那么next()
if(username){
res.send("用户信息");
}else{
next();
}
});
app.get("/admin/login",function(req,res){
a++;
res.render(a.toString()+"2");
});
app.use("/admin",function(req,res){
res.send("你好");
console.log(req.originalUrl+"
"); // '/admin/new'
console.log(req.baseUrl); // '/admin'
console.log(req.path); // '/new'
res.write(req.originalUrl+"
");
res.write(req.baseUrl+"
");
res.write(req.path+"
");
});
app.use("/"); // 拦截任何网址。
// 当不写路径的时候,实际上相当于 "/".
app.use(function(req,res,next){
console.log(new Date());
})
app.listen(3000);
app.use()使用 给了我们增加一些特定功能的场所
app.use(haha); //可以省掉 “/” app.use("/");
app.listen(3000);
function haha(req,res){
var filePath = req.originalUrl;
//根据当前网址,读取public文件夹
//如果有这个文件,那么渲染这个文件
//如果没有这个文件,那么 next();
fs.readFile("./public/"+filePath",function(){
if(err){
//文件不存在
next();
return;
}
res.send(data.toString());
});
}
express 的静态资源服务
var express = require("express");
var app = express();
//静态服务 开放 public
app.use("/jingtai",express.static("./public"));
//新的路由
app.get("/",function(req,res){
res.send("哈哈");
})
app.listen(3000);
render 呈递模板引擎 和send() 只能用一次,可以自动设置
var express = require("express");
var app = express();
app.set("views","a");
app.set("view engine","ejs");
app.get("/",function(req,res){
res.render("haha",{news:[]});
});
app.get("/check",function(req,res){
res.send({
"user":ok;
})
})
app.listen(3000);
get和post
var express = require("express");
var app = express();
app.get("/",function(req,res){
console.log(req.query); // 参数
res.send();
})
app.listen(3000);
var express = require("express");
var app = express();
app.set("view engin","ejs");
var bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({extend:false}));
app.post("/",function(req,res){
res.setHeader('Content-Type','text/plain')
console.log(req.body); // 参数
})
app.listen(3000);
Ajax 前后端交换原理
public文件 里面含有 content.html页面
content.html
jquery 发送 Ajax请求。
<script>
$.get("/news",function(data,status){
})
</script>
app.js
var express = require("express");
var app = express();
var shujuku = [
];
app.use(express.static("./public")); //开放public文件夹
app.get("/news",function(req,res){
res.json(shujuku);
})
app.listen(3000);
noSQL Mongodb
Dao层封装 db.js
var mongodb = require('mongodb').MongoClient;
// 封装成内部函数
function __connectDB(callback){
var url = "mongodb://localhost:27017/haha";
//连接数据库
MongoClient.connect(url,function(err,db){
callback(err,db);
});
}
export.insertOne = function(collectionName,json,callback){
__connectDB(function(err,db){
db.collection(collectionName).insertOne(json,function(err,result){
callback(err,result);
db.close(); //关闭数据库
});
})
};
//__connectDB(function(err,db){
//表示连接成功之后做的事情
//});
调用,使用封装
var express = require("express");
var app = express();
var db = require("./module/db.js");
app.get("/",function(req,res){
db.insertOne("teacher",{"name":"小红"},function(err,result){
if(err){
console.log("插入失败");
return;
}
res.send("插入成功");
})
})
mongoose 简介, 将javaScript对象与数据库产生关系的一个框架,通过操作
对象操作数据库 npm install mongoose
// 引包
var mongoose = require('mongoose');
//连接数据库
mongoose.connect('mongodb://localhost/haha');
//创建了一个模型。猫的模型。所有的猫,都有名字,是字符串 "类"
var Cat = mongoose.model('Cat',{name:String});
//实例化一只猫
var kitty = new Cat({name:'Zildjian'});
//调用这只猫的save方法,保存这只猫。
kitty.save(function(err){
if(err)
console.log('meow');
})