前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >NodeJs简单入门指南--搭建一个简单的http服务器(一)

NodeJs简单入门指南--搭建一个简单的http服务器(一)

作者头像
小蔚
发布2019-09-11 17:43:43
1.4K0
发布2019-09-11 17:43:43
举报
文章被收录于专栏:小蔚记录小蔚记录

NodeJs是什么我想大家已经很了解了,作为一个前端工程师,想要不断提升自己,一般都会接触到后端服务器的技术,NodeJs给我们提供了一个学习成本相对较低的捷径可走。

我一向不赞成评价到底哪个语言好哪个语言烂,存在即合理似乎是这个世界不变的真理。每个语言都有其特性及适用场景。

既然是这样,我们先来梳理一下NodeJs的适用场景:

1:高并发、高I/O场景

2:逻辑较少

3:追求响应速度的项目

以上三点是我们使用NodeJs所要考虑的,由于nodejs是单线程、异步I/O的、事件驱动的语言,所以带来响应速度的基础上也会有很多坑,鉴于此篇博文是纯新手向的,所以并不多阐述回调带来的代码混乱问题,

仅致力于带领读者入门,可以自行搭建http服务器。

同时 如果你想学习nodejs,建议你掌握javascript的底层知识,包括闭包,原型链,OOP等。如果你熟悉commonJS会对你学习nodejs带来更好的体验。

———————————————————————————————————正文—————————————————————————————————————

一:安装

安装就不多说了 现在网上一搜一大堆教程,Mac的 linux的 windows的都有 大家可以查看一下

二:第一个应用

nodejs有两种方式可供调试代码,第一种是直接用控制台交互

安装完nodejs之后,Ctrl + R打开命令行,输入node 就回进入到交互界面

在交互界面支持所有js的表达式 和运算符

你可以:

代码语言:javascript
复制
var a = 1,b = 2; //保存变量

a + b //输出结果 3

支持定义变量和运算 当然 也支持js的调试方法 比如:

代码语言:javascript
复制
console.log("2"); //输出2

console.log(2); //输出2

var a = 2;
console.log(a); //输出2

//好吧 为什么都是2。。。 

三:搭建http服务器

我相信上面的那些东西 很少有人会喜欢看,根本跟我们要说的没什么关系嘛!!

当然 我也觉得 不过有时候debug还是有些用处的。

好吧 既然想听干货,那我们下面就说说正题,搭建一个web服务器

在nodejs中 基本上所有方法都依赖”模块“,nodejs中封装好了很多模块供我们使用

调用模块也很方便 利用require方法 将模块存到变量里 就可以拿来使用了:

代码语言:javascript
复制
var http = require("http");

http.createServer(function(req,res){
    
}).listen(8888);

如上所示,利用require方法获得模块,将模块赋值到http变量上,require里的值必须是字符串。

这里多插一句话,有些童鞋可能会觉得nodejs是一门新的语言,对模块、服务器状态啥啥的搞不懂,这都是个什么玩意?

一如我开头所说,nodejs作为js在服务器上的运行环境,你可以完全把它看成是js 没有任何问题,他的数据类型、语法、对象都与js一毛一样,so 别害怕 其实很简单。

你可以把模块看做事一个js的对象,还记得js的对象是什么么? 我们可以把对象看成是一个无序的键值对,这样看起来是不是清晰多了?

你可以暂时将其想象为:

代码语言:javascript
复制
http = {
  a:function(){},
  b:function(){}  
}

nodejs有两种模块形式,一种是原生模块,即nodejs已定义好的模块,就像上面的http一样

第二种是我们自定义的模块,为了实现某些功能和便于管理,我们经常会将我们的代码封装成一个一个的模块,尽量解耦其间的依赖关系,使代码可以复用。

在nodejs中,每一个js文件即使一个自定义模块,引入方法也很简单:

代码语言:javascript
复制
var server = require("./server");

后面直接加上访问路径即可,访问路径可以是绝对路径也可以是相对路径。

如果你的路径中没有此文件,nodejs会向下查找直到找到这个模块然后引入,所以如果你有两个相同的模块(比如两个服务器模块),最好还是把路径写对的好。

为什么讲上面这些呢? 因为我们想要搭建一个http服务器,需要用到http模块

这里我们可以新建一个server.js文件,将下面的代码复制进此文件:

代码语言:javascript
复制
var http = require("http");

http.createServer(function(req,res){
   res.writeHead(200,{"Content-type":"text/blain"});
   res.write("Hello NodeJs");
   res.end();
}).listen(8888);

这样我们就完成了一个http服务器的搭建,我们先来试下效果 打开命令行,进入到项目目录 也就是server.js的存放目录,然后输入:

代码语言:javascript
复制
node server.js  //记住这个命令

然后打开浏览器,访问localhost:8888,是不是出现熟悉的Hello NodeJs了呢?

下面我们来一点一点看上面的代码,力求用最简单的话来解释清楚

首先我们看到 我们调用了http的creatServer方法,这个方法就是nodejs用来创建一个http服务器的方法,这个方法本身什么都不会做,只会创建一个http服务器,但是他有且仅有一个回调函数

从这里我们可以看到 nodejs里面会大量的用到callback 即回调函数,熟悉javascript的童鞋应该会很熟悉,尤其是经常使用jquery的朋友。

回调函数,从字面理解就很容易理解的通,在我发送一条请求的时候,不会立即响应,而是在处理完成后调用此函数,此函数会返回结果。

那这个回调函数有什么作用呢? 在这个回调函数里我们看到有两个参数,req 和res 即request 和 response 翻译过来也很好理解了,请求和响应。

说到这讲点题外话,web服务器是如何工作的呢?大致可以分为几步:

1:客户端(即浏览器)发送请求

2:服务器接收请求

3:服务器响应请求开始相应逻辑处理

4:最后返回数据给客户端

5:客户端渲染数据

上述第一步和第五步就是传统前端在做的事情,而 2-4步即是nodejs 也就是服务器在做的事情。

知道了web响应过程,我们再来看这两个参数:

request是请求,即是向服务器发送请求,暂时我们还用不上。

response是响应,我们也可以把它看成是一个对象,有键值对,有方法。

上面我们调用了response的三个方法

1:res.writeHead(200,{"Content-type":"text/blain"});

这个方法主要管的是向客户端发送一个响应头部 200即是HTTP状态码 不懂得朋友可以看下这里:

http://www.daqianduan.com/4280.html

状态码后面跟着一个对象,对象里面是一个键值对,Content-type代表文档类型,text/blain代表具体的文档类型。

我们可以试着回顾一下,web的运行原理,我们发送请求,服务器响应请求返回给我们响应页面数据,那既然是页面数据,一定有相应的文档类型,text、css、heml、等等等等

既然这样 我们总要指定打印出来的这个数据是个什么东西对么?所以响应头部中的文档类型是非常重要的。

2:res.write("Hello NodeJs");

这个方法很一目了然了,我们想要给客户端发送数据和页面,总要有一个方法来执行才行,所以我们利用res.write()方法来发送我们想要发送的东西。

3:res.end();

最后调用res.end()方法来为本次响应打上一个句号。有开始有结束。

————————————————————————————————————————结尾分割线——————————————————————————————————————————

这就是我们创建的一个最简单的HTTP服务器了,其实刚开始写的时候想把如何制作路由和如何制作响应程序写在上面的,不过时间关系实在是有点多,也要下班了,所以 剩下的明后天补完,希望大家

一起进步 一起加油。

下一篇我会把我自己总结的路由模块制作方法和处理程序模块方法写完,尽力让大家走进nodejs的大门,开始新的征程。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-03-04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档