Node.js 是什么:
是JavaScript 运行时环境, 不是语言,也不是框架。它是一个平台,运行js代码。
- 包含EcmaScript 的 JavaScript 语言部分(变量、方法、数据类型、内置对象)
- 没有 BOM、DOM,
- Node.js运行环境中 为javascript增加一些服务器级别的API(文件读写,http服务,网络通信等)
特性:
- 事件驱动,
- 异步操作,
- 轻量级、高效
用途:
- Web服务器后台
- 命令行工具 (npm 、git、hexo、)
- 游戏后台等。
核心模块:
Node.js运行环境中 为javascript增加一些服务器级别的API,这些API基本都被包装到一个具名的核心模块中。
- 文件读写模块 fs
- http服务构建模块 http
- 路径操作模块 path
- 操作系统信息模块 os
- .........
要使用这些模块 必须require引入
var http =require("http");
文件读写API (fs 即 file-system):
// 1. 加载模块
var files = require("fs");
//2.调用读文件 方法
files.readFile("2.js",function (error,data){
if(error){
console.log("读文件失败");
}else{
console.log("读文件成功");
}
})
//写文件
files.writeFile("2.js","内容",function (error){
})
读文件:
- 参数一 :文件路径
- 参数二:回调函数(error,data) // data是二进制数,可以通过data.toString 转为字符串。
成功 data 是数据, error 为null
失败 data 为undefined error 是错误对象
写文件:
- 参数一:文件路径
- 参数二:文件内容
- 参数三:回调函数(error)
成功:error 是null
失败 error 是错误对象
注意:向服务器发送文件时,实际并不是真正意义上的发送文件,而是根据Content-type 解析文件里面的内容发送。
http服务API:
//1. 加载 http模块
var http = require("http");
// 2.创建服务器
var server = http.createServer();
// 3.服务端注册请求事件。 当客户端发送请求时,服务器就会执行回调函数,处理请求内容
server.on("request",function (request,response){
console.log("服务器接到请求,请求路径是:"+request.url);
});
// 4.绑定端口号,启动服务器
server.listen(3000,function(){
console.log("服务器启动成功,通过端口http://127.0.0.1:3000/ 访问");
})
3.服务端请求事件处理函数中,需要接收两个参数:
- 参数一: request 请求对象。用来获取客户端的一些请求信息。如请求路径 request.url
- 参数二:response 响应对象。用来给客户端发送响应信息。
request 请求对象的属性
- request.url 请求地址。根据不同请求路径 返回不同的数据。
response 响应对象的方法:
- response. write() 发送响应信息。一定要用 response.end() 结束,否则服务器会一直等待。一般不这样,下面的方式
- response.end("发送的响应信息“); 响应数据必须是是字符串或二进制数。 将数组转字符串JSON.stringify(arr)
- response.setHeader("Content-type","text/plain;charset=utf-8");
4.端口号:用来定位具体的某个应用程序(ip地址定位某台计算机)
需要联网通信的应用程序都会占用一个端口号。
Node中 ,模块有三种
- 具名的核心模块 ,如fs 、http
- 第三方模块
- 用户自定义文件模块
注意:使用require()加载用户自定义文件模块时, 如果是相对路径,必须在文件名前添加 . / , js后缀名可省略。
require("./user.js")
执行顺序是 先执行 加载文件模块的内容 ,然后在执行 require() 后面的内容。
Node中没有全局作用域,只有模块作用域。
模块化编程:
node 在工具栏执行时 通过node 文件名.js 执行js代码,但需要引入多个js文件该怎么办?
- 引入模块化编程。使用用户自定义文件模块。
-
var result = require("./b.js");
但是Node只有模块作用域,两个文件中的变量也不能互相使用,如何让模块间进行通信?
require()两个作用:1.加载文件模块 并执行里面的代码 2.拿到被加载文件模块 导出的 接口对象
- 每个文件模块都有一个exports 对象,将外部文件需要访问的变量 挂载到exports对象上
//b.js exports.foo="keke"; //{ foo:keke } exports.add = function(a,b){ return a+b; } //a.js var getExport = require("./b.js"); //返回的是对象 console.log(getExport.foo); //输出keke console.log(getExport.add(10,20)); //输出30