2.静态资源渲染

2.1.创建http服务器

var http = require('http');
var url = require('url');
var app = http.createServer(function (req, res) {
var url_obj = url.parse(req.url);
if(url_obj.pathname === '/'){
res.write('hello world');
res.end();
}
})
app.listen(3000)

2.2.根据请求的文件类型返回不同的文件内容

首先,我们可以先返回一个html文件,在项目目录下去新建一个template的文件夹,在template文件夹下新建index.html和login.html的文件,分别写入一些测试代码 index.html文件内容

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>欢迎来到首页</h1>
<a href='/login.html'>去登录</a>
</body>
</html>

login.html文件内容

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>欢迎来到登录页</h1>
</body>
</html>

现在我们需要根据访问的文件返回不同的内容,例如:访问http://localhost:3000/index.html 返回template下面index.html文件的内容,同理 访问http://localhost:3000/login.html, 就要返回template目录下login.html文件的内容,按照我们以前讲过的方法,在node后台程序中,我们可以为每个请求写一个路由,例如这样:

var http = require('http');
var url = require('url');
var fs = require('fs');
var app = http.createServer(function (req, res) {
var url_obj = url.parse(req.url);
if(url_obj.pathname === '/'){
//这里返回默认的index.html文件内容
fs.readFile('./template/index.html', 'utf-8', function (err, data) {
if(!err){
res.write(data, 'utf-8');
}
res.end();
})
}
if(url_obj.pathname === '/login.html'){
//这里返回默认的index.html文件内容
fs.readFile(path, 'utf-8', function (err, data) {
if(!err){
res.write(data, 'utf-8');
}
res.end();
})
}
//思考: 如果有100个网页怎么办呢?
})
app.listen(3000)

从上面的代码中我们可以发现,当如果随着网页增多,文件类型增多(例如:css文件、图片文件),当请求变多而且请求的文件类型比较复杂的时候,我们每个文件名写一个if判断就显得不智能了,这个时候,我们需要让程序更加灵活,要让程序更加灵活,先要明白我们返回数据到浏览器的几个步骤:

1 服务器要解析前端发过来的请求地址

2 根据这个请求地址去确定服务器端文件的路径

3 根据文件路径去读取文件内容,返回给浏览器

在这几个步骤中,我们只需要把第2步改灵活就可以了,也就是要达到这样的要求:不管你请求的是什么地址,我都能去确定文件的路径(查找到文件),如果找不到文件,就可以给你返回一个找不到的页面

核心点分析完成后,我们来实现这块代码

var http = require('http');
var url = require('url');
var app = http.createServer(function (req, res) {
// 解析url
var url_obj = url.parse(req.url);
// 拼接请求中的文件地址
var path = './template/'+url_obj.pathname
// 读取文件内容 返回
fs.readFile(path, 'binary', function (err, data) {
if(!err){
res.write(data, 'binary');
}
res.end();
})
})
app.listen(3000)

代码改进后我们发现一个问题,那就是如果请求的时候不写文件类型,例如:"/", "/login",这个时候就没有办法找到对应的文件了,这个时候我们就需要手动去改一些我们自己定义的请求配置,例如:访问"/"的时候,我们默认返回index.html页面

var http = require('http');
var url = require('url');
var app = http.createServer(function (req, res) {
// 解析url
var url_obj = url.parse(req.url);
// 拼接请求中的文件地址
var path = './template/'+url_obj.pathname // “/” 返回index.html页面
if(url_obj.pathname === "/"){
// 读取文件内容 返回
fs.readFile('./template/index.html', 'binary', function (err, data) {
if(!err){
res.write(data, 'binary');
}
res.end();
})
}
// 读取文件内容 返回
fs.readFile(path, 'binary', function (err, data) {
if(!err){
res.write(data, 'binary');
}
res.end();
})
})
app.listen(3000)

这个时候我们发现 读取文件内容返回 这段代码重复写了,于是我们就可以把它封装成函数,只需要每次调用这个函数就可以了,因此,我们的代码还可以优化

var http = require('http');
var url = require('url');
var app = http.createServer(function (req, res) {
// 解析url
var url_obj = url.parse(req.url);
// 拼接请求中的文件地址
var path = './template'+url_obj.pathname // “/” 返回index.html页面
if(url_obj.pathname === "/"){
// 读取文件内容 返回
render("./template/index.html", res);
}
//请求哪个文件就返回哪个文件内容
render(path, res)
})
app.listen(3000) //输入文件路径,返回给前端 function render(path,res){
fs.readFile(path, 'binary', function (err, data) {
if(!err){
res.write(data, "binary");
}
res.end();
})
}

2.3.加载已经写好的静态模版文件

模版文件下载地址:点击下载ajax+node案例静态文件

螺钉课堂视频课程地址:http://edu.nodeing.com

node+ajax实战案例(2)的更多相关文章

  1. node+ajax实战案例(6)

    8.删除客户 8.1.发送id到后台 删除用户信息比较简单,只需要把对应行的id发送到后台就可以了 oTable.onclick = function (ev) { var ev = ev || ev ...

  2. node+ajax实战案例(5)

    6.添加客户 6.1.点击添加按钮,弹出表单框 // 添加用户 显示对话框 var addBtn = document.getElementById('add-btn'); var addUser = ...

  3. node+ajax实战案例(4)

    4.用户登录实现 4.1.用户登录实现思路 1 用户输入登录信息,点击登录的时候把用户登录的这些信息收集起来,然后组装数据通过ajax方式发送到后台 2 后台接到用户输入的登录信息,把这些信息拿去和数 ...

  4. node+ajax实战案例(3)

    3.用户注册实现 3.1.注册用户功能的实现逻辑 1 用户在表单上输入注册信息 2 点击注册后,收集用户在表单上输入的注册信息并且发送给后台 3 后台接收用户发送过来的注册信息 4 后台需要处理数据并 ...

  5. node+ajax实战案例(1)

    1.mysql入门 1.1.数据库相关概念 1.1.1.什么是数据? 描述事物的符号记录称为数据,描述事物的符号可以是数字.文字.声音.图片.视频等,有多种表现形式,都可以经过数字化后存入计算机 1. ...

  6. 《Node.js实战(双色)》作者之一——吴中骅访谈录

  7. 如何从40亿整数中找到不存在的一个 webservice Asp.Net Core 轻松学-10分钟使用EFCore连接MSSQL数据库 WPF实战案例-打印 RabbitMQ与.net core(五) topic类型 与 headers类型 的Exchange

    如何从40亿整数中找到不存在的一个 前言 给定一个最多包含40亿个随机排列的32位的顺序整数的顺序文件,找出一个不在文件中的32位整数.(在文件中至少确实一个这样的数-为什么?).在具有足够内存的情况 ...

  8. Flume实战案例运维篇

    Flume实战案例运维篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Flume概述 1>.什么是Flume Flume是一个分布式.可靠.高可用的海量日志聚合系统,支 ...

  9. 使用Zabbix监控Nginx服务实战案例

    使用Zabbix监控Nginx服务实战案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.  一.编译安装nginx步骤详解并开启状态页 博主推荐阅读: https://www.cn ...

随机推荐

  1. 字符串去除空格的方式(用replace()实现)

    去除所有空格: str = str.replace(/\s+/g,""); 去除两头空格: str = str.replace(/^\s+|\s+$/g,"") ...

  2. Java实现 蓝桥杯 算法训练 Lift and Throw

    试题 算法训练 Lift and Throw 问题描述 给定一条标有整点(1, 2, 3, -)的射线. 定义两个点之间的距离为其下标之差的绝对值. Laharl, Etna, Flonne一开始在这 ...

  3. Java实现 LeetCode 575 分糖果(看看是你的长度小还是我的种类少)

    575. 分糖果 给定一个偶数长度的数组,其中不同的数字代表着不同种类的糖果,每一个数字代表一个糖果.你需要把这些糖果平均分给一个弟弟和一个妹妹.返回妹妹可以获得的最大糖果的种类数. 示例 1: 输入 ...

  4. Java实现 LeetCode 341 扁平化嵌套列表迭代器

    341. 扁平化嵌套列表迭代器 给你一个嵌套的整型列表.请你设计一个迭代器,使其能够遍历这个整型列表中的所有整数. 列表中的每一项或者为一个整数,或者是另一个列表.其中列表的元素也可能是整数或是其他列 ...

  5. 第六届蓝桥杯JavaB组省赛真题

    解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.三角形面积 题目描述 如图1所示.图中的所有小方格面积都是1. 那么,图中的三角形面积应该是多少呢? 请填写三角形的面积.不要填写任何 ...

  6. Android如何使用SharedPreferences轻量级储存

    SharedPreferences只能用来存一些基本数据类型,并且存下的量比较小 直接附代码 和XMl布局 package com.example.okhttpdemo; import android ...

  7. Java实现俄式乘法

    1 问题描述 首先,了解一下何为俄式乘法?此处,借用<算法设计与分析基础>第三版上一段文字介绍: 2 解决方案 package com.liuzhen.chapter4; public c ...

  8. java实现孪生素数

    ** 孪生素数** 孪生素数 所谓孪生素数指的就是间隔为 2 的相邻素数,它们之间的距离已经近得不能再近了,就象孪生兄弟一样.最小的孪生素数是 (3, 5),在 100 以内的孪生素数还有 (5, 7 ...

  9. Canvas绘制圆点线段

    最近一个小伙遇到一个需求,客户需要绘制圆点样式的线条. 大致效果是这样的: 思路一:计算并使用arc填充 他自己实现了一种思路,然后咨询我有没有更好的思路. 先看看他的思路是如何实现的,大致代码如下: ...

  10. Error reporting for dbus

    D-Bus 1.13.14 目录 Detailed Description Function Documentation ◆ dbus_error_free() ◆ dbus_error_has_na ...