要点:
1、初步体会node基于模块化的编程思想,在node中,模块之间的互不影响,模块与模块之间只有通过module.exports(node为了减少开发人员代码,默认添加一句 var exports = module.export)才能实现数据的共享。
2、自定义模块时,尽量做到一个模块处理一个功能,同时写的鲁棒性越强,越好。
3、最重要的:在函数进行异步操作时,想要获取函数中的值,必须通过回调函数才能获取到。如果想要对函数中的方法的值进行操作,在回调函数中处理。在这个例子中如果回调函数发生错误直接返回错误对象,也不需要进行数据类型的转变,如果正确获取到数据,前一个参数设置为null,后一个参数是返回的数据,既可与错误的返回做区分,也可以返回数据,中间通过逗号隔开,这是现阶段第一种理解。
另外在一种理解是,函数作为参数使用,在调用时输入了一个函数,这个函数就是需要拿到回调函数进行处理的函数,对函数相关的异步操作成功或者失败两种不同的结果,调用两次回调函数传入不同的数据,一种是错误对象,另一种是(null,data)两个参数,第一个参数返回null的错误对象。
这里去掉过第一个参数null,程序运行失败,第二种理解的null的理解不太正确。另外,将正确的callback回调函数前添加return是正确执行的,第一种的理解应该较正确但是不透彻。
4、为了使路由更加简洁直观,通过 express.Router()创建一个路由容器,再将路由挂载到路由容器对象上,最后通过 server.use(router)将路由容器挂载到node创建的服务上。
效果:
依赖:
{
"name": "crub-expre",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"art-template": "^4.13.2",
"body-parser": "^1.18.3",
"bootstrap": "^3.3.7",
"express": "^4.16.4",
"express-art-template": "^1.0.1"
}
}
node入口:
var express = require('express')
var fs = require('fs')
var bodyParser = require('body-parser')
var router = require('./router.js')
// 引入自定义的将路由模块化的包
var app = express()
app.use('/node_modules/',express.static('./node_modules/'))
// 开放固定文件夹资源,前一项参数是监听的url,是否有这段字符,后一个参数是监听对应的文件夹
app.use('/public/',express.static('./public/'))
app.engine('html',require('express-art-template'))
app.use(bodyParser.urlencoded({ extended:false }))
app.use(bodyParser.json())
// 模板引擎的配置和body-parser一定要在将路由模块挂载到服务之前
app.use(router)
// 将router容器挂载到node创建的服务器上
app.listen(3000,function(){
console.log('succeed')
})
路由模块:
var fs = require('fs')
// 核心模块只要在所在的模块中被使用了,就需要重新引入
var express = require('express')
var Shuaiges = require('./shuaiges.js')
// 引入帅哥文件夹的操作模块
var router = express.Router()
// 创建一个express的路由容器
router.get('/',function(req,res){
Shuaiges.find(function(err,shuaiges){
if(err){
return res.status(500).send('not find file')
// 返回的状态码500,表示出错
}
res.render('index.html',{
// 在express框架中,默认在views中寻找文件
shuaiges:shuaiges
})
})
})
// 将路由都挂载到router容器上
router.get('/shuaiges/new',function(req,res){
res.render('new.html')
})
router.post('/shuaiges/new',function(req,res){
Shuaiges.save(req.body,function(err){
if(err){
return res.status(500).send('save fail')
}
res.redirect('/')
// 成功跳到首页
})
})
router.get('/shuaiges/edit',function(req,res){
Shuaiges.findById(parseInt(req.query.id),function(err,shuaige){
// query中的查询字符串需要转换成数字类型,跟定义的时候相同
if(err){
return res.status(500).send('can not edit file')
}
res.render('edit.html',{
shuaige:shuaige
})
})
})
router.post('/shuaiges/edit',function(req,res){
Shuaiges.updata(req.body,function(err){
if(err){
return res.status(500).send('updata fail')
}
res.redirect('/')
})
})
router.get('/shuaiges/delete',function(req,res){
Shuaiges.delete(req.query.id,function(err){
if(err){
return res.status(500).send('delete fail')
}
res.redirect('/')
})
})
module.exports = router
帅哥文件操作模块:
var fs = require('fs')
// 引入文件读取核心模块,这个自定义文件模块,封装操作shuaiges.json的方法,做到类似数据库
filePath = './shuaiDb.json'
// 这里路径就是用来存放帅哥的文件夹
e