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

内容索引:
  • 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>

转载于:https://my.oschina.net/u/3150996/blog/3083206

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值