Nodejs-基础-http

3,815 阅读4分钟

简介

node.js相信大家并不陌生,现在很多公司招前端也是要求前端人员必须会node了 先说一下应用场景,目前公司中用node主要是用node来做中间层,当然是大多数公司,因为一般公司项目都已经成型了,加上node人员不好招,所以真完全用来做后台的很少(不过做起来是完全没问题的)。

中间层

很多人都在说node适合做中间层,那么中间层是什么呢? 听着好听,用大白话讲就是给前后端擦屁股的,最早是java的中间件概念,后来后台都不愿意做,然后大公司很多很大很老的项目,没法动,之前写的人也早走了,这时候用中间层接着搞是最方便的了。

前言

大家获取听过node相关的一些框架、express、koa,或者一些企业级应用到egg也好,配合前端服务端渲染的next、nuxt的等等吧,为啥不直接讲koa这种方便的东西呢,因为我一直觉得一件事,工具强了,人就弱了,框架这种东西比狗还多,几年换一个主流、只有先把基础学会,框架其实百变不离其宗。

简易服务器

nodejs肯定是个服务器,那么大家也都知道,任何浏览器和服务器之间的通信都是用http协议来完成的。那么理论上来说,写一个服务器需要对http服务有非常深的了解,不过有兴趣大家可以搜一下,看完了头发都掉光了。node作者肯定也想到了这个事,所以nodejs 系统自带的包里也有http相关的模块来直接用 image.png

创建文件

nodejs需要提前安装,官网上直接下载安装就可以,会装qq  装node也是完全没问题的

首先咱们新建一个项目,里面建一个server.js, 注意不能有中文,名字是随便的,然后代码写成现在这样

const http = require('http');

http.createServer(()=>{
  console.log('有新链接')
})

然后这个时候我们在终端里运行这个文件 node server.js 。 注意,这个时候命令行里直接执行完了,就结束了。这里有个概念需要清楚 一台服务器,是执行一下就完了么?答案肯定是不是,一台服务器需要永远在运行,但是咱们现在写的服务器一下子就结束了,因为咱们还有个非常重要的东西没有做,就是 监听 

监听  ——  通俗点来说就是开一家超市,需要有个售货员在哪等着,有人来了就结账,监听就是这个意思。往专业的角度来说说就更简单了,一台服务器可能会跑很多服务器,比方说web相关的,邮件相关的,什么游戏相关的,这个时候就需要指定一个端口,相当于你订外卖得告诉别人门牌号,好的接下来我们来改一下这个代码

const http = require('http');

let server = http.createServer(() => {
  console.log('有新链接');
});

// 监听端口
server.listen(5000);

这个端口是随便给的,不过有一些通用的端口可能会被占了,比如80-web服务,如果你电脑上装了这些服务就会报错、改一下就好了,后面会说到端口怎么共存,也就是所谓的 端口转发 

然后运行咱们的文件 node server.js 就会看到什么都没有,因为他在一直监听,这时候打开浏览器 输入网址 http://localhost:5000/ 然后查看终端就会看到console.log了 image.png

虽然咱们现在console出来了,但是你可以看到浏览器了没有任何东西 image.png 一直在转,很简单因为咱们的服务器什么都没返回,至于怎么返回下文会说

http.createServer

** 首先来介绍一下 createServer, 他这个第一个会调里会有两个参数 request        请求 - 输入-请求的信息 response      相应 - 输出-服务器的响应

response 里有两个 方法,一个是**write **一个是 end , 也就是一个是写东西,一个是结束,好的咱们再来改造一下代码

const http = require('http');

let server = http.createServer((req, res) => {
  res.write("hello");
  res.end();
});

// 监听端口
server.listen(5000);

注意,修改过文件之后需要关闭服务重新启动 打开终端按 control + c 即可

这时候再来访问http://localhost:5000/ image.png 就可以看到内容了

处理请求

既然能返回数据了,咱们再来看看request里的东西

const http = require('http');

let server = http.createServer((req, res) => {
  console.log(req.url);
  res.write("hello");
  res.end();
});

// 监听端口
server.listen(5000);

首先咱们把请求路径打出来,然后浏览器打开http://localhost:5000/1.jpg 这时候终端里就会打印出来1.jpg image.png 不过大家可能奇怪为什么会访问一个/favicon.ico 这个是网站的图标,这个是chrome自动帮你请求的 如果咱们不想看到他可以直接一个if return掉

这时候我们再来改造一下代码

const http = require('http');

let server = http.createServer((req, res) => {
  console.log(req.url);
  switch (req.url) {
    case '/1.html':
      res.write('1.html');
      break;

    case '/2.html':
      res.write('2.html');
      break;
    default:
      res.write('404');
      break;
  }

  res.end();
});

// 监听端口
server.listen(5000);

然后访问1.html image.png