Node.js学习笔记(二)

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即可得到相应内容。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,924评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,781评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,813评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,264评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,273评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,383评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,800评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,482评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,673评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,497评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,545评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,240评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,802评论 3 304
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,866评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,101评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,673评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,245评论 2 341

推荐阅读更多精彩内容