Node.js无框架调用API写一个简单的留言板项目(服务端渲染)
先creat一个server,index.html是我们的模板,在node不操作dom,bom对象的,通过fs的readfile读取文件,然后res对象的end()发放,把二进制数据或者字符串还给浏览器解析。这边我们通过开放public目录,让客户端可以请求我们的公共静态数据,里面包括css,img,啥的。
先放一下文件目录跟简单代码
文章图片
var http = require('http')
var fs = require('fs')http
.createServer(function(req,res){
var url =req.url
if (url==='/'){
fs.readFile('./views/index.html',function(err,data){
if (err) {
return res.end('404 not found')
}
res.end(data)
})
}else if (url.indexOf('/public/')===0) {
// /public/css/main.css
// /public/js/main.js
// 统一处理:
//如果请求路径是以/public/开头的,则我认为你要获取public中的某个资源
// 所以我们就直接可以把请求路径当作文件路径来进行读取
// 之前这里一直很纠结的是为什么会有else if,在我的印象中好像url选择了'/'就不会再继续执行了,但是其实是我钻牛角尖
// 因为我们这里是个服务器,会不断地接受请求,执行了第一次'/'以后,打开index.html后,会形成新的url发送请求,重建req对象,里面url也是变化的。
// console.log(url)
fs.readFile('.'+url,function(err,data){
if (err) {
return res.end('404 not found')
}
res.end(data)
})
}
})
.listen(3000,function(){
console.log('running')
})
go on
index.html中的大体内容
- 锐客网
添加
{{each dataList}}
- {{$value.name}}.Say:{{$value.message}}
class="pull-right">{{$value.date}}
{{/each}}
注意:在服务端中,文件的路径就不要去写相对路径了。因为这个时候所有的资源都是通过url标识来获取的,我的服务器开放了/public/目录,所以这里的请求路径都写成:/public/xxx
‘/’在这里就是url根路径的意思。
浏览器在真正发请求的时候会最终把http://127.0.0.1:3000拼上,不要再想文件路径了,把所有的这些路径想象成URL地址,这也是前端渲染根后端渲染的不同
后端可以控制访问文件的路径,如果把public的路径注释掉,即让这段代码失效
fs.readFile(’.’+url,function(err,data){
if (err) {
return res.end(‘404 not found’)
}
res.end(data)
})
那么就无法从url中读取到对应的文件了。再次强调,从服务端出来的href都是url,是url就要给他设定if,访问文件的权限。
回到首页渲染。现在已经用url‘/’读取文件‘index.html’,要把comments数据放到模板引擎里面,需要引进包’art-template’,
var template = require('art-template')
var comments = [
{
name:'zeid',
message:'无形装B,最为致命',
dataTime:'2020.6.1'
},
{
name:'brokenheaven',
message:'i will get crown',
dataTime:'2020.6.1'
},
{
name:'recovery',
message:'do or die',
dataTime:'2020.6.1'
},
{
name:'kitty',
message:'i am a cat with magic power',
dataTime:'2020.6.1'
}
]
var htmlStr = template.render(data.toString(),{
comments:comments
})
res.end(htmlStr)
看到这个变量命名了嘛。htmlStr,最后其实返回给浏览器的是字符串
我们可以看看服务器收到请求后返回的数据
文章图片
如果注释这三行
// var htmlStr = template.render(data.toString(),{
//comments:comments
// })
我们得到的服务器的res.data也是字符串对象,我截图了,其实跟上面差不多
文章图片
两个不同res渲染的画面
文章图片
文章图片
emmmm。。。这边主要是服务端渲染,到了首页以后点击发表留言按钮跳转到我们留言页面~也就是post.html,当然还是通过Button的href属性通过url,然后fs.readfile(xxx,function(err,data))实现的,后端渲染就是这样的。
文章图片
下面是post.html里面的提交表单了
【Node.js无框架调用API写一个简单的留言板项目(服务端渲染)】这边的提交地址’/pinglun’,点击发表按钮以后,我们的URL请求是这样的
文章图片
这个url无法判断,后面还有动态的数据,所以只需要判断前面的/pinglun
这时候引进新的模块,'url’模块。。。里面有url.parse()方法,这个方法生成一个对象数据可以帮助解析出pathname
文章图片
图片里面那个地址就是我ball猫那个url,可以看到pathname可以把’/pinglun‘捞出来,不知道这边可不可以用正则,我还是rookie。因为数据是用户输入的,动态变化的。反正这时候我解析出pathname就可以得知用户提交数据过来了
var url = require('url')
var parseObj = url.parse(req.url,true)
var pathname =parseObj.pathnameelse if(pathname === '/pinglun'){
res.setHeader('Content-Type','text/html;
charset=utf-8')
res.end(JSON.stringify(parseObj.query))
}
文章图片
用json格式到我们的数据,使这么长的url也能被识别,以及成功跳转到设定的’/pinglun‘ 条件中
if(pathname === '/pinglun')
往comments数组中添加数据,这个时候不是持久化存储 如果服务端重启就没了嗷,没有连接数据库
var comment =parseObj.query
comment.dataTime = '2020-6-3,23:34'
comments.push(comment)
服务器重定向到首页~如何通过服务器让客户端重定向?状态码302是临时重定向,301永久重定向,在响应头中通过location告诉客户端往哪重定向,如客户端发现服务器的响应码是302就会自动找location,通过setheader
res.statusCode = 302
res.setHeader('Location','/')
到这儿就结束拉~~
文章图片
文章图片
挂载到80端口,提供服务器IP地址,就有了一个QQ留言板QAQ哈哈
文章图片
每天练习一个markdown语法,
我想要只像蛋仔一样的喵喵
醒醒,先搬砖吧!!
推荐阅读
- android第三方框架(五)ButterKnife
- 学无止境,人生还很长
- jhipster|jhipster 升级无效问题
- 说的真好
- 标签、语法规范、内联框架、超链接、CSS的编写位置、CSS语法、开发工具、块和内联、常用选择器、后代元素选择器、伪类、伪元素。
- Node.js中readline模块实现终端输入
- 解决SpringBoot引用别的模块无法注入的问题
- 抱着梦的无眠
- 松软可口易消化,无需烤箱超简单,新手麻麻也能轻松成功~
- 公园游