GundamFans V1.1
GundamFans意在建立一个高达动漫同好分享网站, 分享自己喜爱的高达机体.
后端主体为nodeJS的express框架, 数据库采用mongoDB, 使用mongoose库进行操作. 前端部分使用ejs来编写网页, 使用bootstrap进行装饰, 具有较好的整合性.
主体文件
文件树结构:
D:.
│ index.js
│ package-lock.json
│ package.json├───public //需要app.use(express.static(“public”));指示express来serve public目录
│ global.css //全局css设置
│
└───views //express 默认文件夹
│ index.ejs
│ landing.ejs
│ newms.ejs
│ show.ejs
│
└───partials //公用代码
header.ejs
tail.ejs├───node_modules(略)
关键点
框架与库的区别
<%- include(“partials/header”) %>实现头尾部ejs代码公用
post指令无法直接解析req.body.param, 需要body-parser库
ejs中<% %>为逻辑代码不显示, <%= %>为显示代码, <%- %>显示且作为html运行?
<%- %>读取输入时, 对方可以输入<script 代码进行攻击. sanitize消毒
代码逻辑
首先在本地开启mongoDB, mongod
npm库依赖:
1 | const { render } = require("ejs"); |
相关设置与端口监听:
1 | //指示express来serve public目录 |
连接mongoDB, mongoose.connect("mongodb://localhost:27017/gundam_fans",{useUnifiedTopology: true,useNewUrlParser: true });
构建机体视图schema, 构建模型变量.
1 | let gundamMSSchema = new mongoose.Schema({ |
Router设计:
url | HTTP verb | purpose | 对应ejs |
---|---|---|---|
/ | get | 加载Landing Page | landing |
/wiki | get | 展示所有机体信息 | index |
/wiki | post | 根据页面body表单信息创建机体, redirect(“/wiki”) | - |
/wiki/new | get | 加载机体创建表格, < form action=”/wiki” method=”POST” > | newms |
/wiki/:id | get | 加载id对应机体详情页 | show |
具体实现:
- /wiki get 实现
1 | app.get("/wiki",function(req,res){ |
搜索结果mslist, 传入index页, 取出单个结构即为gundamMSSchema, 多了一个”_id”属性.
e.name等属性直接显示, e_id作为参数传入链接MoreInfo. a href="/wiki/<%= e._id%>"
- 通过点击MoreInfo, 进入机体详情页:
1 | //显示更多机体信息 |
对于url中带有的参数:id
使用 req.params.id
进行访问.
- 新建机体信息的设置:
首先是在wiki/new
下rendernewms
页面, 在该页面下提供form. 该表格将信息以POST报文的形式传给/wiki
页面.
1 | <form action="/wiki" method="POST" > |
/wiki
对POST报文进行响应:
1 | app.post("/wiki",function(req,res){ |
其中注意页面信息由req.body.msname获取, 注意此处需要提前引入bodyparser依赖:
1 | bodyparser = require("body-parser"); |
MongoDB使用整理:
首先在本地开启mongoDB, mongod
连接mongoDB, mongoose.connect("mongodb://localhost:27017/gundam_fans",{useUnifiedTopology: true,useNewUrlParser: true });
构建机体视图schema, 构建模型变量.
1 | let gundamMSSchema = new mongoose.Schema({ |
第一个参数是为模型所创建集合的别名(Mongoose 将为 SomeModel 模型创建数据库集合),第二个参数是创建模型时使用的模式。
创建和修改文档
插入新数据操作:
1 | gundamMS.create( |
或使用save():
1 | // 创建一个 SomeModel 模型的实例 |
可以使用“圆点”加字段名来访问、修改新记录中的字段。修改后必须调用 save()
或 update()
以将改动保存回数据库。
1 | // 使用圆点来访问模型的字段值 |
搜索纪录
findById()
:用指定id
查找文档(每个文档都有一个唯一id
)。findOne()
:查找与指定条件匹配的第一个文档。findByIdAndRemove()
、findByIdAndUpdate()
、findOneAndRemove()
、findOneAndUpdate()
:通过id
或条件查找单个文档,并进行更新或删除。以上是更新和删除记录的便利函数。
查找获取list of elements:
1 | gundamMS.find({},function(err,mslist){ |
查找获取单个element:
1 | gundamMS.findById(req.params.id,function(err,findms){ |
进阶: 以下代码展示了如何在数据库中找到所有网球运动员,并返回运动员姓名和年龄字段。
1 | const Athlete = mongoose.model('Athlete', yourSchema); |
若像上述代码那样指定回调,则查询将立即执行。搜索完成后将调用回调。
若未指定回调,则 API 将返回 Query 类型的变量。可以使用该查询对象来构建查询,随后使用 exec()
方法执行(使用回调)。
1 | // 寻找所有网球运动员 |
查询还能做更多。请参阅 查询(Mongoose 英文文档)
公用html代码
header部分
1 |
|
tail部分
1 | <p class="text-center">Copyright: XinyuanCai.07/2020</p> |
升级
req.body.blog
blog[name]
blog[img]
npm i express-sanitizer
1 | form action: /xx/_id?method=PUT method="POST" |