文档章节

nodejs-第一章-第三节-网络通信-构建http服务

droden
 droden
发布于 08/04 10:39
字数 717
阅读 4
收藏 0
内容索引:
  • Node中的http模块
  • 使用node构建http服务
  • 实现一个静态资源服务器
  • 使用模板引擎处理动态网页
  • 结合数据库渲染动态页面
  • 实现一个留言本案例
  • 第三方HTTP服务框架

Node中的http模块

  • TCP和UDP 都属于传输层协议
  • HTTP,用于浏览器和服务器端进行通信,由于HTTP协议本身并不考虑数据如何传输等其他问题,所以属于应用层协议。
  • Node提供了基本的http和https模块用于HTTP 和 HTTPS的封装
const http = require('http')
const server = http.createServer()
1.1Server实例
API 说明
Event: 'close' 服务器关闭时触发
Event: 'request' 服务器收到请求消息时触发
server.close() 关闭服务
server.listening 获取服务状态
1.2 请求对象
API 说明
request.method 请求方法
request.url 请求路径
request.header 请求头
request.httpVersioni 请求http协议版本
1.3 响应对象
API 说明
response.end() 结束响应
response.setHeader(name, value) 设置响应头
response.removeHeader(name, value) 删除响应头
response.statusCode 设置响应状态码
response.statusMessage 设置响应状态短语
response.write() 写入响应数据
response.writeHead() 写入响应头
2.1 hello world
const http = require('http');
const path = require('path');
const mimie = require('mime'); // 返回扩展名对应的content-type
const fs = require('fs');

const hostname = '127.0.0.1';
const port = 3000;
const server = http.createServer((req, res) => {
  // res.setHeader('Content-type', 'text/plain charset=utf-8'); // 响应字符串
  const url = req.url;
  if (url === '/') {
    fs.readFile(`./index.html`, (err, data) => {
      if (err) {
        throw err;
      }
      res.statusCode = 200;
      res.setHeader('Content-type', 'text/html; charset=utf-8'); // 响应html
      res.end(data);
    });
  } else if (url.startsWith('/assets/')) {
    fs.readFile(`.${url}`, (err, data) => {
      if (err) {
        res.setHeader('Content-type', 'text/plain; charset=utf-8');
        res.statusCode = 404;
        res.end('404 Not Fund.');
      }
      // path.extname(url) 获取文件对应的扩展名
      const contentType = mimie.getType(path.extname(url));
      res.statusCode = 200;
      res.setHeader('Content-type', `${contentType}; charset=utf-8`); // 设置响应头
      res.end(data);
    });
  } else {
    res.statusCode = 404;
    res.setHeader('Content-type', 'text/plain; charset=utf-8');
    res.end('404 Not Fund.');
  }

  // console.log('req', Object.keys(req));
});
server.listen(port, hostname, () => {
  console.log(`server running at http://${hostname}:${port}`);
});

常用模板引擎:
  • marko
  • nunjucks
  • handlebars.js
  • ejs
  • Pug
  • art-template

template-engine.js

const http = require('http');
const path = require('path');
const fs = require('fs');
const template = require('art-template');
const hostname = '127.0.0.1';
const port = 3000;
const server = http.createServer((req, res) => {
  const url = req.url;
  const fileBaseUrl = path.join(__dirname);
  if (url === '/') {
    fs.readFile('./template-engine.html', (err, data) => {
      data = data.toString();
      const ret = template.render(data, {
        msg: 'world',
        todos: [
          { title: '吃饭', completed: false },
          { title: '睡觉', completed: true },
          { title: '打豆豆', completed: false }
        ]
      });
      res.setHeader('Content-type', 'text/html charset=utf-8'); // 响应字符串z
      res.end(ret);
      res.statusCode = 200;
    });
  }
});
server.listen(port, hostname, () => {
  console.log(`server running at http://${hostname}:${port}`);
});

template-engine.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>Document</title>
  </head>
  <body>
    <div class="title">我是我{{ msg }}</div>
    <ul>
      {{ each todos }}
      <li>
        {{ $value.title }}
        <input type="checkbox" {{ $value.completed ? 'checked' : '' }} />
      </li>
      {{ /each }}
    </ul>
  </body>
</html>

© 著作权归作者所有

droden
粉丝 11
博文 90
码字总数 109876
作品 0
朝阳
程序员
私信 提问
JAVA区块链项目实战视频课程

课程介绍 全国首套,基于java的区块链实战教程。目的是让更多的java编程者了解区块链,掌握区块链开发。 1、区块链理论:以node.js例子区块链原理有深刻理解; 2、区块链java实战:深刻理解区...

小红牛
2018/09/14
0
0
效率至上的nodejs 手动实现服务器

这是一个连续的node学习笔记, 本文是第一章, 会持续更新, 持续完善 python好用,用久了就会把人的脾气养起来, nodejs不好用, 但效率很好, 也能彻底治好你的坏脾气 nodejs的回调是我用过的最蛋...

木子昭
2018/08/20
0
0
深入浅出Node.js(一):什么是Node.js

专栏的第一篇文章《什么是Node.js》尝试从各个角度来阐述Node.js的基本概念、发展历史、优势等,对该领域不熟悉的开发人员可以通过本文了解Node.js的一些基础知识。 从名字说起 有关Node.js...

leeldy
2012/10/25
1K
1
远程通信协议:从 CORBA 到 gRPC

自从产业界发明机器联网的那一天就已经开始探索最优的远程通信机制。操作系统如 UNIX、Windows 和 Linux 等都有实现远程通信的内部协议,挑战在于如何向开发人员开放一个通信框架。 一、远程...

RiboseYim
2017/10/31
135
0
Node.js 4.0.0:灵雀云和 OneAPM 的整合测试

## 关于 > Node.js 4.0.0 稳定版刚刚推出,备受期待,迫不及待地想用它写点东西;此外,要把 Demo 放到 Internet 上得有一个公网 IP ,看到[灵雀云](http://www.alauda.cn/)挺不错的而且提供...

OneAPM蓝海讯通
2015/09/15
2
0

没有更多内容

加载失败,请刷新页面

加载更多

关于AsyncTask的onPostExcute方法是否会在Activity重建过程中调用的问题

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/XG1057415595/article/details/86774575 假设下面一种情况...

shzwork
今天
6
0
object 类中有哪些方法?

getClass(): 获取运行时类的对象 equals():判断其他对象是否与此对象相等 hashcode():返回该对象的哈希码值 toString():返回该对象的字符串表示 clone(): 创建并返此对象的一个副本 wait...

happywe
今天
6
0
Docker容器实战(七) - 容器中进程视野下的文件系统

前两文中,讲了Linux容器最基础的两种技术 Namespace 作用是“隔离”,它让应用进程只能看到该Namespace内的“世界” Cgroups 作用是“限制”,它给这个“世界”围上了一圈看不见的墙 这么一...

JavaEdge
今天
8
0
文件访问和共享的方法介绍

在上一篇文章中,你了解到文件有三个不同的权限集。拥有该文件的用户有一个集合,拥有该文件的组的成员有一个集合,然后最终一个集合适用于其他所有人。在长列表(ls -l)中这些权限使用符号...

老孟的Linux私房菜
今天
7
0
面试套路题目

作者:抱紧超越小姐姐 链接:https://www.nowcoder.com/discuss/309292?type=3 来源:牛客网 面试时候的潜台词 抱紧超越小姐姐 编辑于 2019-10-15 16:14:56APP内打开赞 3 | 收藏 4 | 回复24 ...

MtrS
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部