sudo npm i art-template
复制代码
命令在哪执行,就会把包下载到哪里,默认会下载到node_modules目录中javascript
node_modules不要改,不支持改html
<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
模板引擎最先是诞生在服务端mysql
安装sudo npm install art-templateweb
在须要使用的文件模块中加载art-templatesql
只须要使用require方法加载就能够了,参数中的art-template就是下载的包的名字mongodb
查文档使用模板引擎的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
引入公共头部和尾部
<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}}
复制代码
第三方web开发框架,高度封装了http模块
更加专一于业务,而非底层细节
原生的http在某些方面表现不足以应对咱们的开发需求,因此须要使用框架来加快开发效率
框架的目的就是提升效率,让咱们的代码更高度统一
在node中有不少web开发框架,Express只是其中之一
npm install --save express
复制代码
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')))
复制代码
安装:
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内置了一个API能够直接经过req.query来获取
req.query
复制代码
在这里须要使用一个第三方包: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)
复制代码
Express提供了一个响应方法json方法,能够把对象转成字符串send出去
接收一个对象做为参数
res.status(200).json({
success:true,
foo:'bar'
})
复制代码
默认会返回Can not get XXX
若是想要定制404
须要经过中间件来配置
只须要在本身的路由以后增长一个
app.use(function(req,res)){
//全部未处理的请求路径都会跑到这里
//404
}
复制代码
可使用一个第三方命名行工具:nodemon来帮咱们解决频繁修改代码重启服务器问题
nodemon是一个基于Node.js开发的一个第三方命令行工具,咱们使用的时候须要独立安装
#在任意目录执行该命令均可以
npm install --global nodemon
复制代码
安装完毕以后,使用:
node app.js
#使用nodemon
nodemon app.js
复制代码
只要是经过nodemon app.js启动的服务,则它会监事你的文件变化,当文件发生变化的时候,自动帮你重启服务器
Express这个框架中,默认不支持Session和Cookie
可是可使用第三方中间件:express-session来解决
app.use(session({
secret:'itcast', //配置加密字符串,会在原有加密基础之上和这个字符串拼起来去加密,目的是为了增长安全性,防止客户端恶意伪造
resave:false,
//不管是否使用session都默认给你一个钥匙
saveUninitialized:true
}))
复制代码
提示:默认session数据时内存存储的,服务器一旦重启就会丢失,真正的生产环境会把session进行持久化存储(能够存储到数据库中,有对应的插件)
表就是关系
表与表之间存在关系
启动:
mongod
复制代码
修改默认的数据存储目录,能够:
mongod --dbpath=数据存储目录路径
复制代码
中止:
直接ctrl+c
关闭服务台
复制代码
链接和退出:
mongo //默认链接本机的mongoDB服务
exit //在链接状态输入退出
复制代码
由于macbook默认的根目录更新之后就变成只读状态,因此直接启动 输入mongod启动服务的方式是没法启动,须要在后面接着更改后的存储位置,因此启动命令就变成了 mongod --dbpath 指定的文件存放路径
小例子:
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')
}
})
复制代码
{
qq:{
users:[
{name:'张三',age:15},
{},{}
],
products:[
]
},
tabao:{
},
jingdong:{
}
}
复制代码
//链接表数据库
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])
复制代码