express 创建第一个最简单的express服务
新建一个目录 express_study,在这个目录下执行命令npm init --yes
安装express npm install express --save
新建一个app.js文件,编辑内容
1 2 3 4 5 6 7 8 9 10 11 12 const express = require ('express' )var app = express()app.get("/" ,function (req,res ) { res.send("hello express!" ) }) app.listen(3000 ,function ( ) { console .log("app 127.0.0.1:3000 is running ..." ) })
在执行命令 node app.js
,然后在浏览器输入地址,成功显示 hello express!
ctrl+c退出服务
修改代码自动重启服务器nodemon工具
下载nodemon,npm install nodemon --global
使用nodemon 执行文件,nodemon app.js
然后就可以实现更改内容不用重启
服务器了
点击保存(ctrl + s),服务器自动重启
静态资源 在app.js里面加入一行
1 2 app.use("/public/" ,express.static("./public/" ))
就可以在浏览器输入地址查看到相应的静态资源
如果把代码改为
1 2 app.use(express.static("./public/" ))
此时访问index.html 页面只需要 输入 127.0.0.1:3000/index.html
express获取post数据 在express中内置获取表单post请求的API,需要我们使用一个第三方包body-parser
安装
1 npm install --save body-parser
配置
1 2 3 4 5 6 var bodyParser = require ('body-parser' )app.use(bodyParser.urlencoded({extended : false })) app.use(bodyParser.json())
文档
express 使用 art-template 安装:
1 2 npm install art-template --save npm install express-art-template --save
配置:
为了使app.js的代码更整洁,把路由部分的代码分离出去
新建一个 router.js的文件,在里面写内容
1 2 3 4 5 module .exports = function (app ) { app.use('/' ,function (req,res ) { res.send("hello router" ) }) }
则在app.js中需要引入router.js
1 2 3 4 5 6 7 8 9 var express = require ('express' )var router = require ('./router' )var app = express() app.use('/node_modules/' ,express.static('./node_modules/' )) app.use('/public/' ,express.static('./public/' )) router(app) app.listen(3000 ,function ( ) { console .log("server is running at 127.0.0.1:3000" ) })
这样就可以把路由部分写在router.js了,但是这样的路由书写方式还不是我们想要的
express给我们带来了另一种书写方式
1 2 3 4 5 6 7 var express = require ('express' )var router = express.Router() router.get('/' ,function (req,res ) { res.send("hello express-router" ) }) module .exports = router
app.js 则采用另一种方式引用
1 2 3 4 5 6 7 8 9 10 11 var express = require ('express' )var router = require ('./router' )var app = express() app.use('/node_modules/' ,express.static('./node_modules/' )) app.use('/public/' ,express.static('./public/' )) app.use(router) app.listen(3000 ,function ( ) { console .log("server is running in 127.0.0.1:3000" ) })
使用模块化设计,由于router.js上也会有很多方法,所以另外新建一个专门用来操作
数据的文件,新建一个 student.js的文件,用来数据操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 var fs = require ('fs' )var dbPath = './db.json' exports.find = function (callback ) { fs.readFile(dbPath,'utf-8' ,function (err,data ) { if (err){ return callback(err) } callback(null ,JSON .parse(data).students) }) } exports.save = function (student,callback ) { fs.readFile(dbPath,function (err,data ) { if (err){ return callback(err) } var db = JSON .parse(data) student.id = parseInt (db.students.length>=1 ?db.students[db.students.length-1 ].id:0 ) + 1 db.students.push(student) var fileData = JSON .stringify(db) fs.writeFile(dbPath,fileData,function (err ) { if (err){ callback(err) }else { callback(null ) } }) }) } exports.goEdit = function (id,callback ) { fs.readFile(dbPath,'utf-8' ,function (err,data ) { if (err){ return callback(err) } var db = JSON .parse(data) var stu = db.students.find(item => { return item.id == id }) callback(null ,stu) }) } exports.updateById = function (student,callback ) { fs.readFile(dbPath,'utf-8' ,function (err,data ) { if (err){ return callback(err) } var db = JSON .parse(data) var stu = db.students.find(item => { return item.id == student.id }) for (var key in student){ stu[key] = student[key] } var fileData = JSON .stringify(db) fs.writeFile(dbPath,fileData,function (err ) { if (err){ callback(err) }else { callback(null ) } }) }) } exports.delete = function (id,callback ) { fs.readFile(dbPath,'utf-8' ,function (err,data ) { if (err){ return callback(err) } var db = JSON .parse(data) var deleteId = db.students.findIndex(item => { return item.id == id }) db.students.splice(deleteId,1 ) fs.writeFile(dbPath,JSON .stringify(db),function (err ) { if (err){ return callback(err) } callback(null ) }) }) }
在router.js上引入
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 var fs = require ('fs' )var Student = require ('./students' )var express = require ('express' )var router = express.Router()router.get('/students' ,function (req,res ) { Student.find(function (err,data ) { if (err){ return res.status(500 ).send('server error' ) } res.render('index.html' ,{ title: 'hello world'< 大专栏 express /span>, students: data }) }) }) router.get('/students/new' ,function (req,res ) { res.render("new.html" ) }) router.post('/students/new' ,function (req,res ) { Student.save(req.body,function (err ) { if (err){ return res.status(500 ).send('server error' ) } res.redirect('/students' ) }) }) router.get('/students/edit' ,function (req,res ) { res.send("/students/new" ) }) router.post('/students/edit' ,function (req,res ) { res.send("/students/new" ) }) router.get('/students/delete' ,function (req,res ) { res.send("/students/new" ) }) module .exports = router
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 var express = require ('express' )var fs = require ('fs' )var app = express()var router = require ('./router' )var bodyParser = require ('body-parser' )app.engine('.html' ,require ('express-art-template' )) app.use(bodyParser.urlencoded({extended : false })) app.use(bodyParser.json()) app.use("/node_modules/" ,express.static('./node_modules/' )) app.use("/public/" ,express.static('./public/' )) app.use(router) app.listen(3000 ,function ( ) { console .log("server is running at 127.0.0.1:3000" ) })
mongodb 的安装 下载地址
安装完
1 将mongodb路径C:Program FilesMongoDBServer4.0bin添加到环境变量
启动:
1 在想要执行mongodb操作的盘符下新建一个文件夹data,data下再新建一个db文件夹
然后再命令窗口输入 mongod 回车
执行完就代表启动成功了
关闭的话:在命令窗口 ctrl+c 或者关闭命令窗口
1 2 3 4 mongodb 默认使用执行mongod 命令所处盘符目录下的 /data/db 作为自己的数据库存 储目录 所以在第一次执行该命令之前,先自己手动新建一个 /data/db mongod
如果想要修改默认的存储目录,可以
停止
1 2 在开启服务的控制台,直接 ctrl+c 即可停止 或者直接关闭开启服务器的控制台也可以
8.4 连接数据库
连接:
1 2 该命令默认连接本机的mongodb 服务 mongo
退出:
8.5 基本命令
show dbs
查看显示所有数据库
db
查看当前操作的数据库
use 数据库名称
切换到指定数据(如果没有,会新建)
show collections
db.集合.find()
插入数据
db.集合名.inserOne({“name”:”张三”})
8.6 在node中操作mongodb 8.6.1 使用官方的 mongodb 包来操作
8.6.2 使用第三方包 mongoose 操作
使用mongoose工具操作mongodb实现前面的学生管理系统 新建一个文件夹 ,将刚刚使用文件操作的学生管理系统代码除了node_nodules文件夹
都复制过来,删掉db.json(不用文件存储数据了)
文件目录如下
mongoose_crud
public
views
index.html
edit.html
new.html
app.js
router.js
package-lock.json
package.json
students.js
执行npm install
安装依赖包
重写student.js文件内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 var mongoose = require ('mongoose' )var Schema = mongoose.Schemamongoose.connect("mongodb://loaclhost/student" ,{useNewUrlParser : true }) var studentSchema = new Schema({ name:{ type: String , required: true }, gender:{ type: Number , enum:[0 ,1 ], default : 0 }, age:{ type: Number }, hobbies:{ type: String } }) module .exports = mongoose.model("Student" ,studentSchema)
执行命令启动程序,报错,mongoose没定义,因为没有下载mongoose,所以下
载mongoose, npm i mongoose
执行命令,还是报错,因为mongodb没有打开,所以在数据库所在盘执行命令
mongod
启动mongodb数据库。
修改router.js文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 var express = require ('express' )var Student = require ('./studets' )var router = express.Router()router.get('/' ,function (req,res ) { res.redirect('/students' ) }) router.get("/students" ,function (req,res ) { Student.find(function (err,ret ) { if (err) return res.status(500 ).send("server error" ) res.render("index.html" ,{ students:ret }) }) }) router.get("/students/new" ,function (req,res ) { res.render("new.html" ) }) router.post("/students/new" ,function (req,res ) { var data = new Student(req.body) data.save(function (err ) { if (err) return res.status(500 ).send("server error" ) res.redirect('/students' ) }) }) router.get('/students/edit' ,function (req,res ) { var id = req.query.id; Student.findById(id,function (err,ret ) { if (err) return res.status(500 ).send('server error' ) res.render("edit.html" ,{data :ret}) }) Student.find({_id :id},function (err,ret ) { if (err) return res.status(500 ).send('server error' ) res.render("edit.html" ,{data :ret[0 ]}) }) }) router.post("/students/edit" ,function (req,res ) { var id = req.body.id var data = req.body Student.findByIdAndUpdate(id,data,function (err ) { if (err) return res.status(500 ).send("server error" ) res.redirect("/students" ) }) }) router.get('/students/delete' ,function (req,res ) { Student.findByIdAndRemove(req.query.id,function (err ) { if (err) return reqs.status(500 ).send("server error" ) res.redirect("/students" ) }) })
app.js 文件如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 var express = require ('express' )var app = express()var router = require ('./router' )var bodyParser = require ('body-parser' )app.engine('.html' ,require ('express-art-template' )) app.use(bodyParser.urlencoded({extended : false })) app.use(bodyParser.json()) app.use("/node_modules/" ,express.static('./node_modules/' )) app.use("/public/" ,express.static('./public/' )) app.use(router) app.listen(3000 ,function ( ) { console .log("server is running at 127.0.0.1:3000" ) })