当前位置: 首页 > 后端技术 > Node.js

《Nodejs实战》注5:使用Express实现留言板功能

时间:2023-04-03 20:20:14 Node.js

3.ExpressExpress建立在connect的基础上,先安装express脚手架npminstall-gexpress-generator,使用ejs模板引擎express-eexpress-project3.1用户可以注册、登录和注销。用户可以发送消息。访问者可以浏览页面中的条目。有一个简单的RESTAPI3.2渲染视图。Express支持几乎所有的模板引擎。该项目使用ejsExpress并有两个渲染视图。方法:app.render()在程序层使用res.render()在请求或响应层使用res.render()本项目只会使用res.render()3.2.1理解渲染机制主要介绍三个方面调整视图的搜索配置默认模板引擎启用视图缓存以减少文件I/O。首先,设置视图并指定将视图呈现给程序的路径。app.set('views',__dirname+'/views')ps:__dirname表示当前文件的目录,然后指定渲染引擎app.set('viewengine','ejs');viewcacheviewcache默认开启viewcache,如果不开启viewcache,每次渲染rers.render('user',{name:'zmj'})都会从硬盘读取html。如果启用,读取一次html后会缓存起来,下次读取时直接读取缓存,而不是从磁盘读取。3.2.2向视图发送数据res.render()res.localsapp.locals3.3ExpressRoutingGettingStarted在这一节中,留言板有两个功能。使用路由专用中间件对用户提交的内容进行校验,实现对特定路由的校验。为了实现验证,给本程序增加了消息提交的功能(用户不提交消息,你怎么验证=.=)3.3.1消息提交功能消息提交功能需要完成以下几点创建一个消息模型添加一个消息相关的路由创建一个消息表单添加业务逻辑3.3.2创建一个消息模型表明你没有接触过redis,=。=,硬着头皮加油。这里使用redis,安装指南去github下载win10版本https://github.com/MicrosoftA...下载msi省事,会自动帮你配置服务和环境。cmd中测试redis-cli.exe-h-h127.0.0.1-p6379设置键值对setmyKeyabc取出键值对getmyKey这里我们已经安装好了redis服务器,接下来去项目安装redis模块npminstall--saveredisredisdocumentreadme中文命令manualcommand官网apiapiredis支持很多数据结构,基本常用的支持列表创建models/entry.jsconstredis=require('redis')constdb=redis.createClient()classEntry{staticgetRange(from,to,cb){db.lrange('entries',from,to,(err,items)=>{if(err)returncb(err)让条目=[]items.forEach((item)=>{entries.push(JSON.parse(item))})cb(null,entries)})}constructor(obj){//obj={a:1,b:2,c:3}//this[a]=1,this[b]=2,this[c]=3for(letkeyinobj){this[key]=obj[key]}}save(cb){//将消息转换为字符串,保存到Redis列表中constentryJSON=JSON.字符串化(这个)db.lpush('entries',entryJSON,(err)=>{if(err)returncb(err)cb()})}}module.exports=Entrylpush是redis向list中插入数据的方法,first参数是键名,第二个是值,第三个是回调lrange是查询数据的方法,第一个参数是键名,第二个和第三个是起止位置,第四个是回调3.3??.3添加消息相关路由创建模板文件post.ejs

然后创建路由app.get('/post',entries.form)app.post('/post',entries.submit)/*以下是路由/条目文件*///GET'/post'exports.form=(req,res,next)=>{res.render('post',{title:'post'});}//POST'/post'exports.submit=(req,res,next)=>{console.log(req.body.entry)res.redirect('/')//res.render('post',{title:'post'});}另请注意,您必须打开bodyParse才能解析app.use(express.urlencoded({extended:true}));将消息存储到数据库中.body})entry.save((err)=>{if(err)returnnext(err)res.redirect('/')})}显示所有消息//GET'/list'exports.list=(req,res,next)=>{Entry.getRange(0,-1,(err,entries)=>{console.log(entries)res.render('entries',{title:'msglist',entries:entries})})}3.3.4验证表单说到验证表单,你可能首先想到的是完成//POST'/post'exports.submit=(req,res,next)=>{constdata=req.body.entryconstentry=newEntry({username:'zmj',title:data.title,body:data.body})条目。save((err)=>{if(err)returnnext(err)res.redirect('/')})}这种方法是不可扩展的,我们使用特定的中间件来实现验证,我们创建一个中间件中间件/验证。js常量解析字段d=(field)=>{//将entry[filed]解析为['entry','filed']returnfield.split(/\[|\]/g).filter((s)=>s)}constgetField=(req,field)=>{//这个秀操作,我醉了!首先是val=req.body,然后是val=val[entry],然后是val=entry.filedletval=req.bodyfield.forEach((prop)=>{val=val[prop]})returnval}exports。required=(field)=>{field=parseField(field)return(req,res,next)=>{if(getField(req,field)){next()}else{res.render('错误,你必须输入标题')res.redirect('back')}}}exports.lengthAbove=(field,len)=>{field=parseField(field)return(req,res,next)=>{if(getField(req,field).length>len){next()}else{res.render(`error,yourcontentmustexceed${len}length`)res.redirect('back')}}}这段代码可以理解有难度,但是我们使用中间件和添加各种验证方法来使用中间件来验证表单是非常方便的app.post('/post',validate.required('entry[title]'),validate.lengthAbove('entry[body]',5),entries.submit)我们只需要传表单域就可以验证了,是不是很方便,扩展性也很好!本节总结本节实现了留言板的功能,使用redis作为数据库进行留言,并对留言进行了简单的验证。本节做了三个路由GET/post:显示消息表单POST/post:提交消息表单GET/list:获取消息列表总之,学到了很多。很多东西书上没有写,需要自己手动查资料,比如express的一些API,redis的使用等等。