REST 通过HTTP协议实现前后端数据交换的API
REST是一种软件架构模式,这种方法定义了开发软件的方式
资源
实体(文本、图片、歌曲、服务等等)URL
表现层
客户端和服务端之间传递资源的表现形式(text, HTML, XML, JSON等)
状态转化
客户端通过四种动作(GET, PUT, POST, DELETE)对服务资源操作,实现表现层状态转化
REST架构
每一个URL代表一种资源
客户端和服务端之间,传递这种资源的某种表现层
客户端通过四个HTTP动词,对服务端资源进行操作,实现“表现层状态转化”
eg.https://jsonplaceholder.typicode.com/posts/
优点:
Node其实是JS的服务器的运行环境,NodeJS让JS可以作为后端语言
提供了
使得JS可以和操作系统互动(比如读写文件、新建子进程)
实现
Google V8 引擎 语言解释器 + libuv库进行系统资源调度
NPM
Node默认的包管理器,帮助下载别人写好的轮子
常见npm命令
npm -v
npm install moduleName
npm install moduleName -g 可以直接在命令行使用
npm list -g查看所有全局安装的模块
npm list vue 查看某个模块的版本号
npm -g install npm@版本号 更新npm版本
npm install -save moduleName 安装 写入dependencies 运行时的依赖
npm install -save-dev moduleName安装 写入devDependencies 开发时的依赖
简写
- i = install
- -S = --save
- -D = --save-dev
- -g = --global
镜像设置与查看
搭建环境时npm设置成淘宝镜像
设置当前地址(设置为默认地址)
查看镜像的配置结果
使用nrm工具切换淘宝源
切换回官方源
可以使用淘宝定制的cnpm(gzip压缩支持)命令行工具代替默认的npm
npm install -g cnpm --registry=https://registry.npm.taobao.org
例如:cnpm i xxxx -S
全局对象和全局变量
Node提供了以下几个全局对象,是所有模块都可以调用的
global
:表示Node所在的全局对象,类似浏览器的Window对象。注意,在模块文件中声明的全局变量不是全局对象的属性,因为这是该模块私有的process
:该对象表示Node所处的当前进程,允许开发者与该进程互动console
:指向Node内置的console模块,提供命令行环境中的标准输入、标准输出功能_dirname
:当前模块的目录路径_filename
:当前模块的文件名全局函数
setTimeout()
:用于在指定毫秒之后,运行回调函数,该方法返回一个整数,代表这个新建定时器的编号clearTimeout()
:用于终止一个setTimeout方法新建的定时器setInterval()
:用于每隔一定毫秒调用回调函数,该方法返回一个整数,代表这个新建定时器的编号clearInterval()
:终止一个用setInterval方法新建的定时器require()
:用于加载模块Buffer()
:用于操作二进制数据模块
指别人写好的库
实例:
//hello.js
var http = require('http');
//create a server object
http.createServer(function (req, res) {
res.write('hello world!');//write a response to the client
res.end();//end the response
}).listen(8080);//the server object listens on port 8080
console.log('The server is running...')
require('http')
引入NodeJS内置的http模块,以便使用它提供的函数和对象http.createServer()
函数创建一个服务器对象,这个函数接受一个回调函数作为参数,用于处理客户端请求并生成响应res.end()
方法结束响应,表示已经完成对客户端的响应(必须).listen(8080)
服务器开始监听指定端口,也就是会在8080端口接收来自客户端的请求node hello.js
启动该脚本,服务器将会在本地8080端口上运行,每当客户端发送请求时,都会像客户端发送’hello world!'作为响应
模块化结构
支持ES6模块化,但大部分包用的CommonJS规范
模块和文件一一对应,加载一个模块就是加载对应的一个模块文件
require
命令用于指定加载模块,加载时可以省略脚本文件的后缀名(只限于Node,浏览器不能解析该代码)
//自定义模块
//导出file.js
//commonJS规范
module.export{
}
//es6模块化方法
export{
}
//导入
let something = require('./file.js')
//es6方法
import {……} from "./file.js"
模块一旦被加载以后,就会被系统缓存,如果第二次还加载该模块,则会返回缓存中的版本,模块实际只执行一次。如果希望模块执行多次,可以让模块返回一个函数,然后多次调用该函数
核心模块
异步操作
Node采用V8引擎处理JS脚本,最大特点单线程,一次只能运行一个任务,导致Node大量采用异步操作,任务不是马上执行,而是插在任务队列的尾部,等到前面的任务运行完后再执行。由于这种特性,往往采用回调函数(call back)的形式进行定义,回调函数作为异步操作的第二个参数
使用现成的包实现REST API
npm install express
设计一个API,前端可以获取后端的JSON文件
var express = require('express');
var app = express();
app.get('/json_data', function (req, res) {
const data = require('./data.json');
res.json(data);
})
const port = 8080;
app.listen(port, () => {
console.log(`Example app listening at http://localhost:${port}`)
})