nodejs学习笔记
nodejs是基于chrome的V8引擎开发的
一.模块
1.每个模块文件夹中,推荐都写一个package.json文件,这个文件的名字不能改.node将自动读取里面的配置.
有一个main项,就是入口文件.
2.node_modules文件夹下边的文件可以默认读取.
3.var foo = require("./test/foo.js");引入一个js文件.
4.var foo = require("bar");引入node_modules文件夹下的bar文件夹,不带扩展名,说明引入的事一个文件夹.
二.npm (http://www.npmjs.com)
我们刚才学习了,模块就是一些功能的封装,所以一些成熟的,经常使用的功能,都有人封装成模块.并且放在社区中,供人免费下载.
这个伟大的社区,叫做npm.也是一个工具名字,叫 node package management.
1.npm的主要职责是安装开发包和管理依赖项.
安装开发包,使用npm install命令;更新,使用npm update命令.
管理依赖项,借助package.json文件.
2.npm install silly-datetime 安装silly-datetime , 默认安装到node_modules文件夹下.
3.require()中的路径,是从当前这个js文件出发,找到别人.
fs模块读取文件的时候,用绝对路径,_dirname得到当前目录.
4.安装 Node 模块时,如果指定了 --save 参数,那么此模块将被添加到 package.json 文件中 dependencies 依赖列表中。
然后通过 npm install 命令即可自动安装依赖列表中所列出的所有模块。
5.初始化package.json 文件 npm init
三.ejs(后台)模板引擎
1.//引入模块
var ejs = require("ejs");
//模板
var string = "好高兴,今天我买了iPhone<%= a %>s";
//数据
var data = {
a : 6 ,
};
//数据绑定
var html = ejs.render(string,data);
注意:underscore.js库的模板标记和ejs模板引擎的模板标记一样,在一起使用的时候会引起模板冲突
解决办法:修改underscore的模板标记{{ }}
<script type="text/template" id="moban">
<div class="list-group">
<a href="javascript:;" class="list-group-item active">
<h4 class="list-group-item-heading"><%= xingming%></h4>
<p class="list-group-item-text"><%= liuyan%></p>
</a>
</div>
</script>
<script type="text/javascript">
//Ajax读取留言列表
$.get("duly", function (result) {
var json = JSON.parse(result);
var compiled = _.template($("#moban").html());
for(var i = 0; i < json.result.length ; i++){
var html = compiled({"xingming":json.result[i].xingming ,"liuyan":json.result[i].liuyan});
$("#liuyanList").append($(html));
}
})
</script>
2.jade模板引擎(自己了解)
四.express 4.x 框架(http://www.expressjs.com.cn/4x/api.html)
1.Web 应用
Express 是一个基于 Node.js 平台的极简、灵活的 web 应用开发框架,它提供一系列强大的特性,帮助你创建各种 Web 和移动设备应用。
性能
Express 不对 Node.js 已有的特性进行二次抽象,我们只是在它之上扩展了 Web 应用所需的基本功能。
2.app.use(express.static("./public"));express中静态文件处理,比原生nodejs简单很多,只需要这样一句话.
3.express与模板引擎配合,直观清晰.
<ul>
<% for(var i=0; i<news.length; i++){%>
<li><%= news[i]%></li>
<% } %>
</ul>
//设置模板引擎,直接去Node_module文件夹中找ejs模块.
app.set("view engine","ejs");
app.get("/",function(req,res){
//"haha"等价于"./views/haha.ejs", 用render(模板,数据)去渲染页面.
res.render("haha",{
news:["我是模板引擎","我很好","哈哈哈"],
});
});
4.路由
//当访问网址的时候,能做什么:
app.get(网址,function(req,res){
});
app.post(网址,function(req,res){
});
//如果想处理这个网址的任何method的请求,写all();这里的网址不分大小写
//所有的GET参数(?号后面的内容就是参数),都已经被忽略,锚点#也被忽略
app.all(网址,function(req,res){
});
5.中间件
路由get,post这些东西,就是中间件,中间件讲究顺序,匹配上第一个之后,就不会往后匹配了,next函数才能继续匹配.
app.use()也是一个中间件.与get和post不同的是.他的网址不是精确匹配的,而是能够有小文件夹扩展的.
6.get请求和post请求的参数
get请求的参数在URL中,在原生node中,需要使用URL模块来识别参数字符串.在express中,不需要使用url模块了.可以直接使用req.query对象得到;
app.get('/admin', function (req,res) {
//req.query得到的是请求的参数
console.log(req.query);
});
post请求在express中不能直接获得,必须使用body-parser模块.使用后,将可以用req.body得到参数.
但是如果表单中含有文件上传,那么还需要使用formidable模块.
app.use(bodyParser.urlencoded({ extended: false }));
app.post('/',function (req, res) {
console.log(JSON.stringify(req.body));
});
和Itcsat相比,
Itcsat2是前后端分离,前端页面静态化
7.express中的cookie和session(需要引入cookie-parser模块)
五.underscore是一个js库.在项目中用它是呈现模板的,让前后端实现分离,静态化前端模板
<body>
<div class="container">
</div>
//这个就是模板的内容
<script type="text/template" id="newsList">
<div class="jumbotron">
<h1><%= biaoti%></h1>
<p>时间:<%= shijian%> 作者:<%= zuozhe%></p>
<p><%=jianjie%></p>
<p><a class="btn btn-primary btn-lg" href="/news/<%= id%>" role="button">Learn more</a></p>
</div>
</script>
<script src="js/jquery-1.9.1.min.js"></script>
<script src="js/underscore-min.js"></script>
<script type="text/javascript">
//得到模板内容
var mobanstring = $("#newsList").html();
//模板函数
var compiled = _.template(mobanstring);
$.get("/news",function(data,status){
for(var i = 0 ; i < data.length ; i++){
//给模板编辑传递值
var compiledString = compiled(data[i]);
//把生成的HTML内容追加到页面上
$(".container").append(compiledString);
}
});
</script>
</body>
六. MongoDB数据库(cls命令清屏)
1.运行mongo命令,进到安装目录下的bin文件夹,或者是配置环境变量
2.进到bin之后,开启数据库服务,用命令./mongod --dbpath 真实存放数据的数据库的绝对路径,也就是说数据库文档所在的文件夹.
3.用命令./mongo连接数据库
4.use database 使用database(database是数据库名称)数据库,创建数据库
如果要想把这个数据库创建成功,那么必须插入一条数据
数据库中不能直接插入数据,只能往集合(collections)中插入数据.集合不需要创建
db.student.insert({"name":"小花"});其中student就是一个集合
5.show dbs 显示数据库
6.db显示当前使用的数据库
show collections
显示数据库中所有的集合(collection)
查询指定数据库统计信息
db.stats()
7.mongoimport命令
mongoimport --db test --collection student --drop --file stu.json
--db test 想往哪个数据库中导入数据
--collection student 想往数据库中的哪个集合导入数据
--drop 导入之前把集合清空
--file stu.json 要导入的json文件
MongoDB的基本命令
use 命令
MongoDB use DATABASE_NAME 用于创建数据库。该命令将创建一个新的数据库,如果它不存在,否则将返回现有的数据库。
dropDatabase() 方法
MongoDB 的 db.dropDatabase() 命令是用来删除一个当前连接服务的数据库。
drop() 方法
MongoDB 的 db.collection.drop() 是用来从数据库中删除一个集合。其中collection就是那个集合的名称.
insert() 方法
db.teacher.insert({"name":"xiaozhang","kemu":"shuxue"});
要插入数据到 MongoDB 集合,需要使用 MongoDB 的 insert() 或 save() 方法。
update()方法
sjpwd({"name":"小红"},{$set:{"id":2}});
更新文档
find() 方法
db.teacher.find();
要从MongoDB 查询集合数据,需要使用MongoDB 的 find() 方法。
pretty() 方法
db.teacher.find().pretty();
结果显示在一个格式化的方式,可以使用 pretty() 方法.
Limit() 方法
skip() 方法
db.teacher.find().pretty().limit(1);
要限制 MongoDB 中的记录,需要使用 limit() 方法。 limit() 方法接受一个数字型的参数,这是要显示的文档数。
skip() 方法接受一个数字型的参数,这是要略过的文档数。
语法:
limit() 方法的基本语法如下
>db.COLLECTION_NAME.find().limit(NUMBER)
MongoDB 数据转储
创建备份MongoDB中的数据库,应该使用mongodump命令。
mongodump命令的基本语法如下:
>mongodump
恢复数据
恢复备份数据使用MongoDB 的 mongorerstore 命令。此命令将恢复所有的数据从备份目录。
语法:
mongorestore命令的基本语法
>mongorestore
七.cookie和session,加密
1.cookie的使用,需要引包cookie-parser
var express = require("express");
var cookieParser = require("cookie-parser");
var app = express();
//使用cookie-parser 中间件
app.use(cookieParser());
app.get('/', function(req, res) {
//设置cookie
res.cookie("xihao","tybody",{maxAge:900000,httpOnly:true});
res.send(req.cookies);
})
app.get("/xihao", function (req,res) {
//得到get 请求
var xh = req.query.xh;
//记录用户喜好
var xhArr = req.cookies.xh || [];
xhArr.push(xh);
//设置cookie
res.cookie("xh",xhArr,{maxAge:900000,httpOnly:true});
res.send("喜好:" + xhArr);
});
2.session的使用,需要引包express-session
var express = require("express");
var session = require("express-session");
var app = express();
//设置seddion中间件
app.use(
session({
secret:'keyboard cat',
resave:false,
saveUninitialized:true
})
);
app.get("/",function(req,res){
if(req.session.login == "1"){
res.send("欢迎"+req.session.username);
}else {
res.send("你还没有登录");
}
});
app.get("/login", function (req,res) {
//设置session
req.session.login = "1";
req.session.username = "kaola";
res.send("你已经登录成功");
});
app.listen(3000);
3.加密(引包crypto)
var crypto = require("crypto");
module.exports = function (mingma) {
var md5 = crypto.createHash("md5");
var password = md5.update(mingma).digest("base64");
return password;
}
var password = md5(req.query.password);
八.图片处理
第一步: 首先要安装GraphicsMagick 这个服务
第二步: 在nodejs中引gm包
只需要这两不就可以完成常用的图片操作了.