var http = require('http')
1. 创建Server
var server = http.createServer()
2. 监听Server的request请求,设置请求处理函数
//请求、处理、响应。一个请求对应一个响应
var wwwDir = 'D:/Movie/www'//定义一个路径
server.on('request',function(req,res){
var url = req.url
if (url == '/') {
fs.readFile(wwwDir + '/index.html',function(err,data){
if(err){
return res.end('404 Not Found')
}
res.end(data)
})
} else if(url == '/a.txt'){
fs.readFile(wwwDir + '/a.txt', function (err, data) {
if (err) {
return res.end('404 Not Found.')
}
res.end(data)
})
} else if (url === '/index.html') {
fs.readFile(wwwDir + '/index.html', function (err, data) {
if (err) {
return res.end('404 Not Found.')
}
res.end(data)
})
} else if (url === '/apple/login.html') {
fs.readFile(wwwDir + '/apple/login.html', function (err, data) {
if (err) {
return res.end('404 Not Found.')
}
res.end(data)
})
}
})
3. 绑定端口号,启动服务
server.listen(3000,function(){
console.log('running...')
})
files.forEach(item)
,给获取到的每一项item。然后利用${}来引用变量1. 如何得到 wwwDir 目录列表中的文件名和目录名
fs.readdir
2. 如何将得到的文件名和目录名替换到 template.html 中
2.1 在 template.html 中需要替换的位置预留一个特殊的标记(就像以前使用模板引擎的标记一样)
2.2 根据 files 生成需要的 HTML 内容
fs.readdir('H:\www', function (err, files) {
if (err) {
return res.end('Can not find www dir.')
}
2.1 生成需要替换的内容
var content = ''
files.forEach(function (item) {
// 在 EcmaScript 6 的 ` 字符串中,可以使用 ${} 来引用变量
content += `
${item}/
2017/11/2 上午10:32:47
`
})
2.3 替换
data = data.toString()
data = data.replace('^_^', content)
3. 发送解析替换过后的响应数据
res.end(data)
})
npm install art-template
{{}}
来引用数据对象中的数据。var template = require('art-template')
var fs = require('fs')
fs.readFile('./tpl.html', function (err, data) {
if (err) {
return console.log('读取文件失败了')
}
// 默认读取到的 data 是二进制数据
// 而模板引擎的 render 方法需要接收的是字符串
// 所以我们在这里需要把 data 二进制数据转为 字符串 才可以给模板引擎使用
var ret = template.render(data.toString(), {
name: 'Jack',
age: 18,
province: '北京市',
hobbies: [
'写代码',
'唱歌',
'打游戏'
],
title: '个人信息'
})
console.log(ret)
}
上边例子调用这个HTML,替换里边的数据内容:
tpl.html:
Document
大家好,我叫:{{ name }}
我今年 {{ age }} 岁了
我来自 {{ province }}
我喜欢:{{each hobbies}} {{ $value }} {{/each}}
fs.readFile('读取的文件',function(err,data){
嵌套fs.readdir读取文件夹中的文件名和目录名
fs.readdir('文件夹路径',function(err,files){
再次嵌套template.render用于渲染模版HTML
template.render(data.toString(),{
渲染的数据
title: '哈哈',
files: files
})
})
})
var http = require('http')
var fs = require('fs')
var template = require('art-template')
var server = http.createServer()
var wwwDir = 'D:/Movie/www'
server.on('request', function (req, res) {
var url = req.url
fs.readFile('./template-apache.html', function (err, data) {
if (err) {
return res.end('404 Not Found.')
}
// 1. 如何得到 wwwDir 目录列表中的文件名和目录名
// fs.readdir
// 2. 如何将得到的文件名和目录名替换到 template.html 中
// 2.1 在 template.html 中需要替换的位置预留一个特殊的标记(就像以前使用模板引擎的标记一样)
// 2.2 根据 files 生成需要的 HTML 内容
// 只要你做了这两件事儿,那这个问题就解决了
fs.readdir(wwwDir, function (err, files) {
if (err) {
return res.end('Can not find www dir.')
}
// 这里只需要使用模板引擎解析替换 data 中的模板字符串就可以了
// 数据就是 files
// 然后去你的 template.html 文件中编写你的模板语法就可以了
var htmlStr = template.render(data.toString(), {
title: '哈哈',
files: files
})
// 3. 发送解析替换过后的响应数据
res.end(htmlStr)
})
})
})
server.listen(3000, function () {
console.log('running...')
})
此处的字符串(完整的HTML页面结构)内容:
这个模板字符串:
hello{{name}}
- 客户端渲染,不利于SEO(搜索引擎优化)
- 服务端渲染是可以被爬虫抓取到的,客户端异步渲染是很难被爬虫抓取到的。
- 真正的网站是两者结合起来的。例如京东的商品列表,是服务端渲染(有利于搜索引擎搜索到),而评论区则采用客户端渲染(动态加载数据,响应更快)
var http = require('http')
http
.createServer(function(req,res){
//写原先server.on的内容
})
.listen(3000,function(){
console.log('Server is running')
})
var fs = require('fs')
var http = require('http')
var url = require('url')
var template = require('art-template')
var comments = [
{
name: '张三',
message: '今天天气不错!',
dateTime: '2015-10-16'
},
{
name: '张三2',
message: '今天天气不错!',
dateTime: '2015-10-16'
},
{
name: '张三3',
message: '今天天气不错!',
dateTime: '2015-10-16'
},
{
name: '张三4',
message: '今天天气不错!',
dateTime: '2015-10-16'
},
{
name: '张三5',
message: '今天天气不错!',
dateTime: '2015-10-16'
}
]
url.parse('网址',ture)返回的内容:
URL:{
protocol: 'http:',
host:'127.0.0.1:3000',
port:'3000',
hostname:'127.0.0.1',
query:'/pinglun?name=%E7%9AXXXX&message=%3XXX',
//注意:第二个参数为true时,query会解析为
query:{name:'何勤',message:'套猴子'}
pathname: '/pinglun',
path: '/pinglun?namexxxx',
herf: 'http://127....'
}
else if (pathname == '/pinglun'){
两件事:
1. 获取提交过来的内容,并把它放入comments对象中。
var comment = parseObj.query
comment.dateTime = '2017-11-2 17:11:22'
comments.unshift(comment)
2. 修改状态码为302,让其重新定位到首页
res.statusCode = 302
res.setHeader('Location', '/')
res.end()
}
if(pathname.indexOf('/public/') === 0){
fs.readFile('.' + pathname, function(err,data){
if (err) {
return res.end('404 Not Found.')
} else {
res.end(data)
}
})
}
http
.createServer(function(req,res){
url核心插件的parse方法将路径解析为一个方便操作的对象
var parseObj = url.parse(req.url, true)
var pathname = parseObj.pathname
if (pathname == '/'){
fs.readFile('./views/index.html', function(err,data){
if (err) {
return res.end('404 Not Found.')
} else {
var htmlStr = template.render(data.toString(), {
comments: comments
})
}
res.end(htmlStr)
})
} else if (pathname == '/post') {
fs.readFile('./views/post.html', function(err,data){
if (err) {
return res.end('404 Not Found.')
} else {
res.end(data)
}
})
} else if (pathname.indexOf('/public/') === 0){
fs.readFile('.' + pathname, function(err,data){
if (err) {
return res.end('404 Not Found.')
} else {
res.end(data)
}
})
} else if (pathname == '/pinglun'){
对于我们来讲,其实只需要判定,如果你的请求路径是/pinglun的时候,那我就认为你提交表单的请求过来
然后做两件事:
1. 获取提交过来的内容,并把它放入comments对象中。
var comment = parseObj.query
comment.dateTime = '2017-11-2 17:11:22'
comments.unshift(comment)
2. 修改状态码为302,让其重新定位到首页
res.statusCode = 302
res.setHeader('Location', '/')
res.end()
}
})
.listen(3000,function(){
console.log('running')
})
form中action的值就是请求的url地址。post: