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. 从0开始探究vue-公共变量的管理

    背景 在Vue项目中,我们总会遇到一些公共数据的处理,如方法拦截,全局变量等,本文旨在解决这些问题 解决方案 事件总线 所谓事件总线,就是在当前的Vue实例之外,再创建一个Vue实例来专门进行变量传递 ...

  2. Java实现 LeetCode 835 图像重叠(暴力)

    835. 图像重叠 给出两个图像 A 和 B ,A 和 B 为大小相同的二维正方形矩阵.(并且为二进制矩阵,只包含0和1). 我们转换其中一个图像,向左,右,上,或下滑动任何数量的单位,并把它放在另一 ...

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

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

  4. Java实现 LeetCode 509 斐波那契数

    509. 斐波那契数 斐波那契数,通常用 F(n) 表示,形成的序列称为斐波那契数列.该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和.也就是: F(0) = 0, F(1) = 1 ...

  5. Java实现 洛谷 P1015 回文数(N进制回文数)

    输入输出样例 输入样例#1: 10 87 输出样例#1: STEP=4 import java.util.Scanner; public class 回文数2 { public static void ...

  6. java中Condition类的详细介绍(详解)

    已找不到原文了,还望原文博主看到能告诉小白一下,一定标注原文地址 一 condition 介绍及demo Condition是在java 1.5中才出现的,它用来替代传统的Object的wait(). ...

  7. Java实现 洛谷 P1909 买铅笔

    import java.util.Arrays; import java.util.Scanner; public class Main { public static void main(Strin ...

  8. Linux 用户组管理命令

    groupadd 组名,可以添加用户组 groupmod -n 新组名 老组名,可以修改组名 groupdel 组名,可以删除组(组中不能有初始用户存在,附加用户无所谓) gpasswd -a 用户名 ...

  9. 实用!看Python如何光速合并多个PDF

    大家好,今天分享一个实用的办公脚本:将多个PDF合并为一个PDF, 例如我手上现在有如下3个PDF分册,需要整合成一个完整的PDF. 如果换成你操作的话,是不是打开百度搜索:PDF合并,然后去第三方网 ...

  10. ZooKeeper 基础入门

    什么是ZooKeeper Apache ZooKeeper 是一个开源的实现高可用的分布式协调服务器.ZooKeeper是一种集中式服务,用于维护配置信息,域名服务,提供分布式同步和集群管理.所有这些 ...