美文网首页
Node.js学习笔记(二)

Node.js学习笔记(二)

作者: GallonLau | 来源:发表于2017-12-11 17:11 被阅读0次
    http

      Node.js 标准库提供了 http 模块,其中封装了一个高效的 HTTP 服务器和一个简易的HTTP 客户端。http.Server 是一个基于事件的 HTTP 服务器,它的核心由 Node.js 下层 C++部分实现,而接口由 JavaScript 封装,兼顾了高性能与简易性。http.request 则是一个HTTP 客户端工具,用于向 HTTP 服务器发起请求。

    引用模块,并创建一个服务

    const http = require('http');
    const server = http.createServer((req,res) =>{
      res.writeHead(200,{"Content-Type":"text/plain;charset=utf-8");
      res.end("Hello World")
    });
    server.listen(8080);
    

    启动起来后在浏览器内输入localhost://8080即可在访问,内容显示为Hello World

    如果我们需要把一个页面展示到浏览器里面,可以这样实现。

    const http = require('http');
    const fs = require('fs');
    
    const server = http.createServer((req,res) => {
      res.writeHead(200, {'Content-Type': 'text/html;charset=utf-8'});
      fs.readFile("./index.html", function (err, data) {
        if (err) {
          res.end("连接服务器错误");
          throw err;
        } else {
          res.end(data);
        }
      });
    })
    server.listen(9696);
    

    访问该地址后我们就能看的指定的页面。

      get
      我们可以用一个简单的get请求扒取网络数据:

    const http = require('http');
    
    http.get('http://baidu.com',function (req,res) {
      let html = '';
      req.on('data',function (data) {
        html += data;
      });
      req.on('end',function () {
        console.log(html);
      })
    });
    

      得到数据为:

    <html>
    <meta http-equiv="refresh" content="0;url=http://www.baidu.com/">
    </html>
    

      我们知道,get发送请求时,如果有数据会把数据以参数形式绑定到url上,然后传递给后端。

    const http = require('http');
    const url = require('url');
    const util = require('util');
    
    http.createServer(function(req, res){
      res.writeHead(200, {'Content-Type': 'text/plain;charset=utf-8'});
      // 解析 url 参数
      const params = url.parse(req.url, true).query;
      res.write("网站名:" + params.name);
      res.write("\n");
      res.write("网站 URL:" + params.url);
      res.end();
    
    }).listen(3000);
    

      然后在浏览器里输入http://localhost:3000/user?name=gallon&url=www.sina.com,即可输出:

    网站名:gallon
    网站 URL:www.sina.com
    

      当get发起请求时,我们可以解析url而获得我们想要的参数。

      post
      POST请求的内容全部都在请求体重,http.ServerRequest并没有一个属性内容为请求体,原因是等待请求体传输可能是一件耗时的工作。所以node.js默认不会解析请求体,当你需要时,需要手动来做。

    const http = require('http');
    const querystring = require('querystring');
    
    const postHTML =
      '<html><head><meta charset="utf-8"><title>Node.js 实例</title></head>' +
      '<body>' +
      '<form method="post">' +
      '网站名: <input name="name"><br>' +
      '网站 URL: <input name="url"><br>' +
      '<input type="submit">' +
      '</form>' +
      '</body></html>';
    
    http.createServer( (req, res) => {
      let body = "";
      req.on('data', (chunk) => {
        body += chunk;
      });
      req.on('end',  () => {
        body = querystring.parse(body);
        res.writeHead(200, {'Content-Type': 'text/html; charset=utf8'});
        if(body.name && body.url) {
          res.write(`网站名:${body.name}`);
          res.write("<br>");
          res.write(`网站 URL:${body.url}`);
        } else {
          res.write(postHTML);
        }
        res.end();
      });
    }).listen(3000);
    

      这样可以简单地处理post请求。

      路由
      当我们起一个node服务时,如果不做任何处理,如下:

    const http = require('http');
    http.createServer( (req, res) => {
      res.writeHead(200,
        {"Content-Type":"text/html;charset='utf-8'"}
      );
      res.end("<h1>我是个小小鸟</h1>")
    }).listen(3000);
    

      我们在浏览器输入http://localhost:3000访问到的是我们写进去的内容,当输入http://localhost:3000/gallon 或者http://localhost:3000/index.html同样是刚写进去的内容,这个时候就需要区分req中的url已达到路由的效果。

    const http = require('http');
    http.createServer( (req, res) => {
      if(req.url === '/gallon'){
        res.writeHead(200,
          {"Content-Type":"text/html;charset='utf-8'"}
        );
        res.end("<h1>我是个小小鸟</h1>")
      }else if(req.url === '/index.html'){
        res.writeHead(200,
          {"Content-Type":"text/html;charset='utf-8'"}
        );
        res.end("<h1>这是首页</h1>")
      }
    }).listen(3000);
    

      这样就实现了一个简单的路由效果。

    express

      Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP 工具。使用Express可以快速地搭建一个完整功能的网站。
      Express 框架的核心特性:
      1.可以设置中间件来响应 HTTP 请求。
      2.定义了路由表用于执行不同的 HTTP 请求动作。
      3.可以通过向模板传递参数来动态渲染 HTML 页面。
      简单的express应用,由于express不是node内置的工具,故需要安装。

    const express = require('express');
    const app = express();
    
    app.get('/index.html',(req,res) =>{
      res.send('Hello World');
    }).listen(2000);
    

      在浏览器中输入localhost:2000/index.html即可访问到相应内容。通过express可以很方便地实现postget服务。

      request和response的对象介绍:
      Request 对象 - request 对象表示 HTTP 请求,包含了请求查询字符串,参数,内容,HTTP 头部等属性。常见属性有:

        req.app:当callback为外部文件时,用req.app访问express的实例
        req.baseUrl:获取路由当前安装的URL路径
        req.body / req.cookies:获得「请求主体」/ Cookies
        req.fresh / req.stale:判断请求是否还「新鲜」
        req.hostname / req.ip:获取主机名和IP地址
        req.originalUrl:获取原始请求URL
        req.params:获取路由的parameters
        req.path:获取请求路径
        req.protocol:获取协议类型
        req.query:获取URL的查询参数串
        req.route:获取当前匹配的路由
        req.subdomains:获取子域名
        req.accepts():检查可接受的请求的文档类型
        req.acceptsCharsets / req.acceptsEncodings / req.acceptsLanguages:返回指定字符集的第一个可接受字符编码
        req.get():获取指定的HTTP请求头
        req.is():判断请求头Content-Type的MIME类型
    

      Response 对象 - response 对象表示 HTTP 响应,即在接收到请求时向客户端发送的 HTTP 响应数据。常见属性有:

        res.app:同req.app一样
        res.append():追加指定HTTP头
        res.set()在res.append()后将重置之前设置的头
        res.cookie(name,value [,option]):设置Cookie
        opition: domain / expires / httpOnly / maxAge / path / secure / signed
        res.clearCookie():清除Cookie
        res.download():传送指定路径的文件
        res.get():返回指定的HTTP头
        res.json():传送JSON响应
        res.jsonp():传送JSONP响应
        res.location():只设置响应的Location HTTP头,不设置状态码或者close response
        res.redirect():设置响应的Location HTTP头,并且设置状态码302
        res.send():传送HTTP响应
        res.sendFile(path [,options] [,fn]):传送指定路径的文件 -会自动根据文件extension设定Content-Type
        res.set():设置HTTP头,传入object可以一次设置多个头
        res.status():设置HTTP状态码
        res.type():设置Content-Type的MIME类型
    

      静态文件托管:
      当我们编写html时,需要用到静态资源,比如imagecss时,直接通过./引用会报错,因为它们没挂载到该服务下,即通过localhost:****/你是访问不到该资源,前面我们可以通过fs读取文件内容后放在指定url下,但是这样很麻烦。express给我们提供了一个便捷的方法,即

    const express = require('express');
    const app = express();
    
    app.use((express.static('public'));
    

      public为公共资源文件夹。
      通常,expressswig结合可在html中绑定变量。

    express.js
    
    const express = require('express');
    const swig = require('swig');
    
    const app = express();
    
    app.engine('html',swig.renderFile);
    app.set('views',__dirname + '/gallon');
    app.set('view engine','html');
    
    app.get('/index.html',(req,res) =>{
      res.render('index.html',{content:"走一个"});
    }).listen(2000);
    
    index.html
    
    <!doctype html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport"content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
    </head>
    <body>
        <h1>这是首页</h1>
        <h2>{{content}}</h2>
    </body>
    </html>
    
    

      在浏览器中访问localhost:2000/index.html即可得到相应内容。

    相关文章

      网友评论

          本文标题:Node.js学习笔记(二)

          本文链接:https://www.haomeiwen.com/subject/hmykixtx.html