Node.js中用到的第三方框架(经常使用、持续更新)

第三方框架

一、art-template使用

安装
sudo npm i art-template
复制代码

命令在哪执行,就会把包下载到哪里,默认会下载到node_modules目录中javascript

node_modules不要改,不支持改html

在浏览器中简单的使用art-template
<body>
	<!-- 在浏览器中须要引用lib/template-web.js -->
	<script src="node_modules/art-template/lib/template-web.js"></script>
	<script type="text/template" id="tpl">
		hello {{name}}
	</script>
	<script>
		var ret=template('tpl',{
			name:'Jack'
		})
		console.log(ret)
	</script>
复制代码

模板引擎不关心字符串内容,只关心本身能认识的模板标记语法,例如{{}}java

{{}}语法被称之为mustache语法,八字胡语法node

在node中使用模板引擎

模板引擎最先是诞生在服务端mysql

使用步骤
  1. 安装sudo npm install art-templateweb

  2. 在须要使用的文件模块中加载art-templatesql

    只须要使用require方法加载就能够了,参数中的art-template就是下载的包的名字mongodb

  3. 查文档使用模板引擎的APIshell

var template=require('art-template')
复制代码

例子数据库

var template=require('art-template');

var ret=template.render('hello {{ name }}',{
	name: 'Jack'
})

console.log(ret)
复制代码
数据类型

默认读取到的data是二进制数据

而模板引擎的render方法须要接收的是字符串

因此须要把data二进制数据抓呢日字符串才能够给模板引擎使用

第三方模板引擎

在node中,有不少第三方模板引擎均可以使用,不是只有art-template

ejs、jade(pug)、handlebars、nunjucks

art-template中的include-extend-block语法
include引入界面公共部分

引入公共头部和尾部

<body>
	{{include './header.html'}}
		
	{{include './footer.html'}}
</body>
复制代码
模板继承

layout.html

<body>
	{{include './header.html'}}
		//留一个坑,将要留给孩子去填坑
		
		{{ block 'content'}}
			<h1>默认内容</h1>
		
		{{/block}}
	{{include './footer.html'}}
</body>
复制代码

index.html

{{extend './layout.html'}}

//填坑语法(如果index页面没有,则会显示layout页面的默认内容)
{{block 'content'}}
	<div>
		<h1>index页面填坑内容</h1>
	</div>
{{ /block }}
复制代码

孩子也有本身的样式

好比样式和js代码

一样能够在对应的位置留坑

{{ block 'head'}}{{/block}}

{{ block 'script'}}{{/block}}
复制代码

二、Express

第三方web开发框架,高度封装了http模块

更加专一于业务,而非底层细节

原生的http在某些方面表现不足以应对咱们的开发需求,因此须要使用框架来加快开发效率

框架的目的就是提升效率,让咱们的代码更高度统一

在node中有不少web开发框架,Express只是其中之一

起步

安装
npm install --save express
复制代码
hello world
const express=require('express')
const app=express()

app.get('/',(req,res)=>res.send('hello world!'))

app.listen(3000,()=>console.log('Example app listening on port 3000!'))
复制代码
基本路由

路由(router):路由其实就是一张表,这个表中有具体的映射关系

  • 请求方法
  • 请求路径
  • 请求处理函数

get:

当你以GET方法请求/的时候,执行对应的处理函数
app.get('/',function(req,res){
	res.send('Hello World!')
})
复制代码

post:

当以post方法请求/的时候,指定对应的处理函数
app.post('/',function(req,res)){
	res.send('Got a POST request')
}
复制代码
静态服务
app.use(express.static('public'))
app.use(express.static('files'))

app.use('/static',express.static('public'))

app.use('/static',express.static(path.join(__dirname,'public')))
复制代码

在Express中使用art-template

安装:

npm install --save art-template
npm install --save express-art-template
复制代码

配置与使用:

var express=require('express')
var app=express()

app.use('/public/',express.static('./public/'))
//也能够这样写  app.use('/public/',express.static('public'))
//开发public资源夹,能够直接访问public文件夹中的文件



//配置使用art-template模板引擎
//第一个参数,表示当渲染以art结尾的文件的时候使用art-template模板引擎
//express-art-template是专门用来在express中把art-template整合到express中
//虽然外面这里不须要记载art-template可是也必须安装
//缘由就在于express-art-template依赖了art-template

app.engine('art',require('express-art-template'))

//express为response响应对象提供一个方法render
//render方法默认是不可用的。可是若是配置了模板引擎就可使用
//res.render('html模板名',{模板数据})
//第一个参数不能写路径,默认回去项目中的views目录中查找该模板文件
//Express有一个约定:开发人员把全部的视图文件html都放到views目录中

app.set('views',render函数的默认路径)
//若是要修改默认的views目录,则可使用set方法
复制代码
使用模板函数的get方法
app.get('/error',function(req,res){
	res.render('404.art',{
		title:'测试'
	})
})
使用res.send方法
app.get('/post',function(req,res){
	res.send('post page')
})

设置端口
app.listen(3000,function(){
	console.log('running...')
})
复制代码

views文件夹名称:视图渲染存储目录

在Express获取get请求参数

express内置了一个API能够直接经过req.query来获取

req.query
复制代码
在Express获取post表单请求体

在这里须要使用一个第三方包:body-parser

安装:

npm install --save body-parser
复制代码

配置:

0引包
var bodyParser=require('body-parser')

配置body-parser
只要加入这个配置,则在req请求对象上会多出一个属性:body
也就是说能够直接经过req.body来获取表单POST请求体数据了

app.use(bodyParser.urlencoded({extended:false}))
app.use(bodyParser.json())
复制代码

使用:

app.use(function(req,res){
	res.setHeader('Content-Type','text/plain')
	res.write('you posted:\n')
	能够经过req.body来获取表单POST请求体数据
	res.end(JSON.stringify(req.body,null,2))
})
复制代码
将路由模块从入口模块分离出来

方法一:

不是很方便可是须要了解

主要利用了模块系统,实际上之间将方法传递

在app.js入口模块中

var express=require('express')
var router=require('./router.js')

var app=express()

router(app)
复制代码

在router.js路由模块中

module.exports=function(app){
	app.get('/students/new',function(req,res){

	})
}
复制代码

方法二:

Express中提供了一种更好的方式专门用来包装路由

路由模块 router.js 中

//加载express模块
var express=require('express')

//建立一个路由容器
var router=express.Router()

//把路由都挂载到router路由容器中
router.get('/students',function(req,res){

})

//最后再把router导出来
module.exports=router	
复制代码

在入口模块app.js中

var router=require('./router.js')

app.use(router)
复制代码
json方法

Express提供了一个响应方法json方法,能够把对象转成字符串send出去

接收一个对象做为参数

res.status(200).json({
	success:true,
	foo:'bar'
})
复制代码
Express对于没有设定的路径请求

默认会返回Can not get XXX

若是想要定制404

须要经过中间件来配置

只须要在本身的路由以后增长一个

app.use(function(req,res)){
//全部未处理的请求路径都会跑到这里
//404
}
复制代码

三、nodemon第三方命令行工具

可使用一个第三方命名行工具:nodemon来帮咱们解决频繁修改代码重启服务器问题

nodemon是一个基于Node.js开发的一个第三方命令行工具,咱们使用的时候须要独立安装

#在任意目录执行该命令均可以

npm install --global nodemon
复制代码

安装完毕以后,使用:

node app.js

#使用nodemon
nodemon app.js
复制代码

只要是经过nodemon app.js启动的服务,则它会监事你的文件变化,当文件发生变化的时候,自动帮你重启服务器

四、express-session

Express框架中使用express-session插件

Express这个框架中,默认不支持Session和Cookie

可是可使用第三方中间件:express-session来解决

  • npm install express-session
  • 配置(必定要在app.use(router)以前
  • 使用
    • 当把这个插件配置好以后,就能够经过req.session来访问和设置Session成员
    • 添加Session数据:req.session.foo='bar'
    • 访问Session数据:req.session.foo
app.use(session({
	secret:'itcast',       //配置加密字符串,会在原有加密基础之上和这个字符串拼起来去加密,目的是为了增长安全性,防止客户端恶意伪造
	resave:false,
	//不管是否使用session都默认给你一个钥匙
	saveUninitialized:true
}))
复制代码

提示:默认session数据时内存存储的,服务器一旦重启就会丢失,真正的生产环境会把session进行持久化存储(能够存储到数据库中,有对应的插件)

MongoDB

关系型数据库和非关系型数据库

表就是关系

表与表之间存在关系

  • 全部的关系型数据库都须要经过sql语言来操做
  • 全部的关系型数据库在操做以前都须要设计表结构
  • 并且数据表还支持约束
    • 惟一的
    • 主键
    • 默认值
    • 非空
  • 非关系型诗句库很是的灵活
  • 有的非关系型数据库就是key-value对
  • 可是MongoDB是长的最像关系型数据库的非关系型数据库
    • 数据库 -》数据库
    • 数据表-》集合(数组)
    • 表记录-》(文档对象)
  • MongoDB不须要设计表结构,很是灵活
  • 能够任意的往里面存数据,没有结构性这么一说

启动:

mongod
复制代码

修改默认的数据存储目录,能够:

mongod --dbpath=数据存储目录路径
复制代码

中止:

直接ctrl+c
关闭服务台
复制代码

链接和退出:

mongo //默认链接本机的mongoDB服务

exit	//在链接状态输入退出
复制代码
MongoDB macbook记录

由于macbook默认的根目录更新之后就变成只读状态,因此直接启动 输入mongod启动服务的方式是没法启动,须要在后面接着更改后的存储位置,因此启动命令就变成了 mongod --dbpath 指定的文件存放路径

基本命令
  • show dbs
    • 查看显示全部数据库
  • db
    • 查看当前操做的数据库
  • use 数据库名称
    • 切换到指定的数据库(若是没有会新建)
  • 插入数据
在node中操做MongoDB
  • 可使用官方的mongodb包来操做
  • 使用第三方mongoose来操做

小例子:

var mongoose=require('mongoose')
mongoose.connect('mongodb://localhost/test')


// 表名,({文档:类型})
var Cat=mongoose.model('Cat',{name:String})

var kitty=new Cat({name : 'Zac'})


// 持久化保存
kitty.save(function(err){
	if (err) {
		console.log(err)
	}else{
		console.log('meow')
	}
})

复制代码

基本概念

  • 数据库(能够有多个)
  • 集合(能够有多个集合collection,mysql中是表,MongoDB中是数组)
  • 文档 --> {}
  • 文档解构很灵活没有限制
  • MongoDB很是灵活,不须要向MySQL同样先建立数据库,表,设计表结构
    • 在这里只须要:当你须要插入数据的时候,只须要指定往哪一个数据库的哪一个集合操做就能够
    • 一切都有MongoDB来帮你自动完成建库表这件事
{
	qq:{
		users:[
			{name:'张三',age:15},
			{},{}
		],
		products:[
		
		]
	},
	tabao:{
	
	},
	jingdong:{
	
	}
}
复制代码

操做指南

设计Schema发布model
//链接表数据库

var mongoose=require('mongoose')

var Schema=mongoose.Schema

// test能够改为不存在的数据库会自动建立
mongoose.connect('mongod://localhost/testdb');

// 设计集合结构(表结构)
// 字段名称就是表结构中的属性名称
// 值
// 约束的目的是为了保证数据的完整性,不要有脏数据
// var blogSchema=new Schema({
// 	title: String,
// 	author: String,
// 	body:String,
// 	comments:[{body:String,date:Date}],
// 	date:{type:Date,default:Date.now},
// 	hidden:Boolean,
// 	meta: {
// 		votes:Number,
// 		favs:Number
// 	}
// })

var userSchema =new Schema({
	userName:{
		type:String,
		required:true //必须有
	},
	password:{
		type:String,
		required:true //必须有
	},
	email:{
		type:String
	}
})

// 将文档结构发布为模型
// mongoose.model 方法就是用来将一个架构发布为model
// 	第一个参数:传入一个大写名词单数字符串用来表示你的数据库名称
// 	例如 User 会变成 users
// 	第二个参数:架构 Schema
// 	返回值:模型构造函数
var User=mongoose.model('User',userSchema)
复制代码
增长数据
var admin=new User({
	username:'admin',
	password:'123456',
	email:'admin@admin.com'
})

admin.save(function(err,ret){
	if (err) {
		console.log('保存失败')
	}else {
		console.log('保存成功')
	}
})
复制代码
查询全部

第一个参数可选知足的全部

User.find(function(err,ret){
	if (err) {
		console.log('查询失败')
	}else {
		console.log(ret)
	}
})
复制代码
查询一个

第一个参数为参照条件

User.findOne({
	username:'zs'
},function(err,ret){
	if (err) {
		console.log('查询失败')
	}else {
		console.log(ret)
	}
})
复制代码
删除知足条件的
User.remove({
	username:'zs'
},function(err,ret){
	if (err) {
		console.log('删除失败')
	}else {
		console.log('删除成功')
		console.log(ret)
	}
})
复制代码
更新数据
Tank.findByIdAndUpdate(id, { $set: { size: 'large' }}, { new: true }, function (err, tank) {
  if (err) return handleError(err);
  res.send(tank);
});
复制代码

根据条件删除一个(remove 和 update也是同样的操做):

Model.findOneAndRemove(condition,[option],[callback])
复制代码

根据id删除一个:

Model.findByIdAndRemove(id,[option],[callback])
复制代码
相关文章
相关标签/搜索