初步的nodejs

我们一起no的js

这是我个人学习Node.js的一些笔记
笔记目录

  • [Hello World!]
  • [函数的调用]
  • [模块调用]
  • [路由]

Hello World!

想不想让自己的JS代码运行在Node.js的服务器上呢???
Node.js这两年来很火哦,我们要不要一起来学习呢???虽然有点迟了,但是我们努力学,一定也是会有收获的,你说呢??

第一步,安装Node.js

  • 我们可以直接到Node.js官网进行下载,Node.js的版本更新得太快了,最好还是到官网下载最新的版本。左边的LTS版本是稳定版本,我们一般使用这个。右边的Current是测试版,有时候也用到,因为我们是初学者,那就用左边的吧!!。
    blob.png
  • 安装软件,直接打开安装包,全程下一步就行了,我们也没必要改安装路径了。
  • 测试是否安装成功,运行命令窗口,输入如下指令。 如果结果一样就说明安装成功。
    blob.png

    第一个HelloWorld

  • 在c盘找到node.js的安装路径。创建hello.js文件,如下图:
    blob.png
  • hello.js文件里的代码如下:保存好代码。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    var http = require("http") ; //使用require指令来载入http模块
    http.createServer(function(req,res){
    /*此行代码说明
    发送Head头部
    HTTP状态值:200:OK
    内容类型:text/plain
    */
    res.writeHead(200,{'Content-Type':'text/plain'});
    res.write('Hello World\n');
    }).listen(1337,'127.0.0.1');
    console.log('Server running at http://127.0.0.1:1337/');
  • 在hello.js文件的目录下打开命令窗口(因为还没配置环境变量),执行node hello.js命令,结果如下图:
    blob.png

  • 不要关闭命令窗口,在浏览器网站栏输入:http://127.0.0.1:1337/ ,你将看到你的第一个node.js代码的hello world!!

blob.png

我们来讲解一下代码
如果你细心观察浏览器的窗口,就会发现127前那个小圆圈在转个不停。意思就是说网页还在加载。加载一段时间后就卡住了。然后再刷新就报错,因为之前的还在加载。这个应该怎么描述我还不懂。我们来解释一下为什么为这样吧。
http.createServer(function(req,res){这行代码是用http模块创建一个服务,}).listen(1337,'127.0.0.1');这个的意思是说这个服务对这个端口监听和锁定这个ip,服务里面的代码呢就是res.writeHead(200,{'Content-Type':'text/plain; charset=utf-8'});这行代码是响应的一些头信息,res.write('Hello World\n');最后在文档中写下Hello World。我们写出内容后面加上个res.end("结束");请求结束。这时候就不会不停地加载了。
我们在写内容之前加上个console.log("访问成功");在后台输出提示得到请求。重新运行,刷新,发现后台有两次访问,这不是我们预期的效果。为什么会这样呢,是因为访问一次之后又回头访问。有什么办法解决呢。下面是完整的代码。
消除第二次访问,也有结束部分。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var http = require("http") ; //使用require指令来载入http模块
http.createServer(function(req,res){
/*此行代码说明
发送Head头部
HTTP状态值:200:OK
内容类型:text/plain
*/
res.writeHead(200,{'Content-Type':'text/plain; charset=utf-8'});
if(req.url!=="/favicon.ico"){ //清除第2此访问
console.log("访问成功");
res.write('Hello World\n');
res.end("结束");
}
}).listen(1337,'127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');

总结:

  • 我们学会了安装Node.js
  • 我们运行了第一个程序
  • 坚持学下去哦!!
  • 我们调用 http 模块提供的函数: createServer 。这个函数会返回 一个对象,这个对象有一个叫做 listen 的方法,这个方法有一个数值参数, 指定这个 HTTP 服务器监听的端口号。

学习到的新代码

node.js真的很好用,以下这部分代码是搭建服务必须的:

1
2
3
4
5
6
7
8
9
10
11
var http = require("http");
http.createServer(function(req,res){
res.writeHead(200, {"Content-Type" : "text/plain; charset=utf-8"});
if(req.url!=="/favicon.ico"){//如果请求不是***
res.write("必须"+"\n");
console.log("告诉后台访问");
res.end("访问结束");
}
}).listen(1337);
console.log("Server run at http://127.0.0.1:1337");

函数的调用

我们说以下这个代码是开启服务必备的,那开启服务之后就要有所操作,有操作就是要用到函数,那我们这一节就来学习调用函数。

1
2
3
4
5
6
7
8
9
10
11
12
var http = require("http");
http.createServer(function(req,res){
res.writeHead(200, {"Content-Type" : "text/plain; charset=utf-8"});
if(req.url!=="/favicon.ico"){//如果请求不是***
res.write("必须"+"\n");
console.log("告诉后台访问");
res.end("访问结束");
}
}).listen(1337);
console.log("Server run at http://127.0.0.1:1337");

同一个文件下的函数调用

直接调用就行,这个好理解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var http = require("http");
http.createServer(function(req,res){
res.writeHead(200, {"Content-Type" : "text/plain; charset=utf-8"});
if(req.url!=="/favicon.ico"){//如果请求不是***
res.write("必须"+"\n");
fun1(res);//调用方法
console.log("告诉后台访问");
res.end("访问结束");
}
}).listen(1337);
console.log("Server run at http://127.0.0.1:1337");
//函数内部一个简单的方法
function fun1(res){
res.write("hello,我是fun1");
}

不同文件下的函数调用(单独一个)

先在同一个根目录下创建一个文件some_fun.js,里面的代码如下:

1
2
3
4
5
6
7
//some_fun.js文件下的一个方法
function controller(req,res){
res.write("发送请求");
}
//将这个方法发送出来
module.exports = controller;

在运行的文件下与其取得关联:
var otherFun = require("./some_fun.js");这是与另一个文件取得关联,路径是相对路径。 otherFun(req,res);直接用取得关联时定义的对象名调用。这种方法在以后的开发中很少用,因为只能调用一个函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var http = require("http");
//与另一个文件取得关联,括号里的相对路径打好来就行了
var otherFun = require("./some_fun.js");
http.createServer(function(req,res){
res.writeHead(200, {"Content-Type" : "text/plain; charset=utf-8"});
if(req.url!=="/favicon.ico"){//如果请求不是***
res.write("必须"+"\n");
//直接用关联时定义的变量名访问
otherFun(req,res);
console.log("告诉后台访问");
res.end("");
}
}).listen(1337);
console.log("Server run at http://127.0.0.1:1337");

不同文件下的函数调用(单独多个)

用这种对象的格式写module就能调用多个方法。
some_fun.js文件夹里的代码:

1
2
3
4
5
6
7
8
9
//多个函数调用
module.exports={
getName:function(res){
res.write("Hello Allen"+"\n");
},
getPlay:function(res){
res.write("I am a student"+"\n");
}
}

第一种调用方法,用点表示方法调用,这种方法常用,但是缺欠一种功能,如果方法名是不合法的呢??因为创建函数的时候函数名是以字符串的形式创建,可以是不合法的。下面来说一下调用不合法函数名的函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var http = require("http");
//创建module.exports输出,
var otherFun = require("./some_fun.js");
http.createServer(function(req,res){
res.writeHead(200, {"Content-Type" : "text/plain; charset=utf-8"});
if(req.url!=="/favicon.ico"){//如果请求不是***
res.write("必须"+"\n");
//用点表示方法调用方法
otherFun.getName(res);
otherFun.getPlay(res);
console.log("告诉后台访问");
res.end("");
}
}).listen(1337);
console.log("Server run at http://127.0.0.1:1337");

函数名不合法的情况下

some_fun.js文件里的代码,特别注意函数名。函数名是以字符串的形式传递的,所以所以的字符串形式都是不会报错的,例如,我们可以用get !@ * (Play这种名称。但是如果用点表示法调用就会报错了,所以下面我们用方括号的方法调用。

1
2
3
4
5
6
7
8
9
//不合法的函数名
module.exports={
"get Name":function(res){
res.write("Hello Allen"+"\n");
},
"get !@ * (Play":function(res){
res.write("I am a student"+"\n");
}
}

调用函数,可以直接把函数名的字符串放进方括号里,也可以把函数名的字符串放进一个变量里再通过变量使用。如果用点表示法就会报错。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var http = require("http");
//创建module.exports输出,
var otherFun = require("./some_fun.js");
http.createServer(function(req,res){
res.writeHead(200, {"Content-Type" : "text/plain; charset=utf-8"});
if(req.url!=="/favicon.ico"){//如果请求不是***
res.write("必须"+"\n");
//用点表示方法调用方法
otherFun["get Name"](res);
otherFun["get !@ * (Play"](res);
//把函数名放进一个变量里再通过变量调用
var getName = "get Name" ;
otherFun[getName](res) ;
console.log("告诉后台访问");
res.end("");
}
}).listen(1337);
console.log("Server run at http://127.0.0.1:1337");

总结

这节我们学习了怎么调用函数,是为以后的学习做准备的。

学习到的新代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//小文件抛出接口
module.exports = controller;
//与另一个文件取得连接,括号里的相对路径打好来就行了
var otherFun = require("./some_fun.js");
//访问小文件的唯一的方法
otherFun(req,res);
//小文件可以抛多个函数,函数间用逗号隔开,函数名可用双引号括起来,可以是任意字符。
module.exports={
getName:function(res){
res.write("Hello Allen"+"\n");
},
getPlay:function(res){
res.write("I am a student"+"\n");
}
}
//用点表示方法调用方法
otherFun.getName(res);
otherFun.getPlay(res);
//用方括号的方法调用非法命名的函数
otherFun["get Name"](res);

模块的调用

这里的使用,效果有些像java里的,能做一些像java里的类那样的操作。

简单类的调用

上节我们学过怎么把另一个文件夹的的方法引进来使用,这节在上一节的基础上添加一些功能。下面这个虽然是一个方法,但是能像类一样工作。应该不难看懂,就不多说了。

1
2
3
4
5
6
7
8
9
10
11
function User(){
this.id ;
this.name ;
this.age ;
this.enter = function(){
console.log(this.name+"进入图书馆");
}
}
//将方法映射出来
module.exports = User ;

上一节我们也说过创建一个服务必不可少的代码,是像下面那样,那我们以后的笔记,必要的代码就不说了,只说几个重要的操作代码。必要代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var http = require("http") ;
//在这里写我们要引入的模块
http.createServer(function(req,res){
//请求头部
res.writeHead(200,{"Content-Type" : "text/plain; charset=utf-8"});
if(req.url !== "/favicon.ico"){
//在这里写我们需要操作的代码。
res.end("");
};
}).listen(1337);
console.log("Server running at http://127.0.0.1:1337");

下面这个代码是我们使用上面的那个类的代码。:

1
2
3
4
5
6
7
8
9
10
//将类引进来
var User = require("./modules/User.js");
//实例化一个对象
var user = new User();
//使用实例化的对象,为对象的属性赋值
user.id = "1" ;
user.name = "Allen" ;
user.age = 21 ;
user.enter();//调用类中的方法

就是像这么使用。
但是这样但还不是很好,id、name、age这些参数的接收还不太好,所以我们就修改如下:这样的调用就更明了了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//-----------User.js-------------------
function User(id, name, age){
this.id = id;
this.name = name;
this.age = age;
this.enter = function(){
console.log(this.name+"进入图书馆");
}
}
//将方法映射出来
module.exports = User ;
//-----------ch_3.js----------------------
var user = new User(1, "Allen", 20);
user.enter();

继承类的调用

类似java中的继承类的使用。user是用户,用户可以是老师,可以是学生,老师和学生有相同的属性也有不同的属性。那我们就要用到继承了。
User.js相同的目录下创建一个Teacher.js文件,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
//将User类引导进来
var User = require("./User") ;
function Teacher(id, name, age){
//将User应用进来,相当于java中的实现类的继承操作
User.apply(this, [id, name, age]);
//子类的新方法
this.teach = function(res){
res.write(this.name+"在讲课");
}
}
//将Teacher类映射出去
module.exports = Teacher ;

那我们现在的下一步就是要使用上面的Teacher类了。直接将Teacher类引导进来,调用父类的方法,调用自己的方法。

1
2
3
4
5
6
7
//引用继承类的模块,跳过User,直接使用Teacher
var Teacher = require("./modules/Teacher");
//引用继承类的模块,相当于实例化对象
var teacher = new Teacher(1, "张老师", 40);
teacher.enter();//调用父类的方法
teacher.teach(res);//调用自己的方法

那来到这里,我们就学会的类的调用,与类的继承的调用了。那我们还可以再写一个类的继承,学生的类的还没写呢。

学生类的继承

也是跟上面Teacher类的继承一样。我也进行了练习,所以,我只贴代码出来算了。不再重复记笔记。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//------------Student.js---------------
var User = require("./User");
function Student(id, name, age){
User.apply(this, [id, name, age]);
this.study = function(res){
res.write(this.name+"学会了自己学习");
}
}
module.exports = Student ;
//------------ch_3.js-------------------------
var Student = require("./modules/Student");
var student = new Student(1, "小明", 12) ;
student.enter();
student.study(res);

学习到的新代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//创建一个对象
function User(id, name, age){
}
//实例化一个对象,调用对象里的方法
var user = new User(1, "Allen", 20);
user.enter();
//继承一个父类,得到接口,实用上父类,自己的函数,抛出接口
var User = require("./User") ;
function Teacher(id, name, age){
//将User应用进来,相当于java中的实现类的继承操作
User.apply(this, [id, name, age]);
this.teach = function(res){
res.write(this.name+"在讲课");
}
}
module.exports = Teacher ;//抛出接口
//使用继承类跟使用类一样,不多说。

路由

什么是路由

在这里,我们需要了解一下什么是路由,跟我们平时所说的路由器是不同的。
我们访问一个地址是,网址是这样的,例如我们前面说过的:http://127.0.0.1:1337/,这应该叫网页的路径,而有时候我们点击连接后面就多了些东西出来,http://127.0.0.1:1337/login之类的。路由的操作过程就是:在JS中,我们通过得到后面的login来访问login方法。具体路由是个什么概念我也说不清楚,我们应该看一下百科,我还没有时间去看,我先把学到的东西记录下来吧。

取得地址后的路径

  • urlnode.js内置的一个模块。我们获取地址栏输入的路由地址,然后通过正则法除掉反斜杠,在后台输出,这时候我们访问网址的时候,在后面添加的字符串就台在后台输出。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    //node.js里内置的一个模块
    var url = require("url");
    var pathName = url.parse(req.url).pathname;//路由地址
    //通过正则法删除斜线
    pathName = pathName.replace(/\//, "");
    console.log(pathName);
  • 上一节我们学习过,调用另一个文件的多个函数,这里我们又要用到这个知识点啦,开不开心?重温一下:

    不同的路径做不同的操作

    1
    2
    3
    4
    5
    6
    7
    8
    module.exports = {
    login:function(res){
    res.write("你是不是要登录\n");
    },
    register:function(res){
    res.write("你是要注册吗?");
    }
    }

通过路径来调用

  • 在运行的文件n4_rout.js文件中的主要代码如下:
    1
    2
    3
    4
    5
    //导入另一个文件的模块
    var myFunction = require("./modules/router.js");
    //在这里通过得到的路由名来调用方法
    myFunction[pathName](res);

在这里的第一步是取得与另一个文件的关联。还用到了上一节函数调用那一节的知识,通过变量储存函数名,用方括号的方法调用函数。这里变量储存的函数名来源于前面通过地址栏得到的路由,在这里我们访问的网站一定要是:http://127.0.0.1:1337/loginhttp://127.0.0.1:1337/register。其他的都报错,因为其他的传入的函数名不正确,无法正常调用,就报错,在后面我们将学习到如果进行异常处理。

学习到的新代码

1
2
3
4
5
6
7
//node.js里内置的一个模块
var url = require("url");
var pathName = url.parse(req.url).pathname;//路由地址
//通过正则法删除斜线
pathName = pathName.replace(/\//, "");

Allen151 wechat
评论功能没弄好,如果有问题,欢迎在我公众号上提问!!
坚持原创,您的支持将鼓励我继续创作!