一、Node开发概述
1.为什么要学习服务器端开发基础
随着近年来互联网的发展,全栈工程师的概念开始兴起,所谓全栈。即包括用户界面,业务逻辑、数据建模、服务器、网络及环境等。这就意味着,全栈工程师要输来熟练处理各层间的交互。而现在,有了node.js的出现,用JavaScript语言既可以进行客户端的开发,又可以进行服务端的开发,还可以与数据库交互。这样便大大减少了开发人员的学习成本,为程序开发创造了良好的环境。
用node.js可以进行网站开发、在线游戏的后台服务器、物联网开发的软件部分、控制台应用程序、数据的交互等。
2.服务器端开发要做的事情
- 实现网站的业务逻辑
- 数据的增删改查
3.为什么选择Node
- 使用JavaScript 语法开发后端应用
- 生态系统活跃,有大量开源库可以使用
- 前端开发工具大多基于Node开发
4.Node是什么: 代码运行环境
二、Node运行环境搭建
三、Node.js快速入门
1.Node.js 的组成
- js由三部分组成:ECMAScript,DOM,BOM
- Node.js 由 ECMAScript 及 Node环境提供的一些附加API组成的
2.Node.js基础语法
1.HelloWorld,最简单搭建一个服务器
//require表示引包,引包就是引用自己的一个特殊功能
var http = require("http");
//创建服务器,参数是一个回调函数,表示如果有请求进来,要做什么
var server = http.createServer(function(req,res){
//req表示请求,request; res表示响应,response
//设置HTTP头部,状态码是200,文件类型是html,字符集是utf8
res.writeHead(200,{"Content-type":"text/html;charset=UTF-8"});
res.end("哈哈哈哈,我买了五个iPhone" + (1+2+3) + "s");
});
//运行服务器,监听3000端口(端口号可以任改,此时的是‘127.0.0.1’)
server.listen(3000,"127.0.0.1");
注意:res.end()的内容必须为字符串
2.运行Node.js
1.运行
Node.js是服务器的程序,写的js语句,都将运行在服务器上。返回给客户的,都是已经处理好的纯html。 node [name].js 表示运行你自己的文件,[name]就是你实际的文件名字,再打开浏览器
2.修改
如果想修改程序,必须中断当前运行的服务器,重新node一次,刷新,才行。 ctrl+c,就可以打断挂起的服务器程序。此时按上箭头,能够快速调用最近的node命令。
3.总结
你会发现,我们本地写一个js,打死都不能直接拖入浏览器运行,但是有了node,我们任何一个js文件,都可以通过node来运行。也就是说,node就是一个js的执行环境。 我们现在,要跑起来一个服务器,这个服务器的脚本,要以.js存储。是一个js文件。用node命令运行这个js文件罢了。
3.Node.js全局对象global
四、Node.js模块化开发
1.js开发弊端: 文件依赖 命名冲突
2.软件中的模块化开发
3.开发规范
- Node.js 规定一个js文件就是一个模块,模块内部定义的变量和函数外部无法得到
- 模块内部使用exports对象进行成员导出,使用require方法导入其他模块
4.模块成员导出
const add = (n1, n2) => n1 + n2;
exports.add = add;
5.模块成员的导入
const a = require('./03-module-a');
console.log(a.add(10, 20));
6.模块成员导出的另一种方式
const greeting = name => `hello${name}`;
module.exports.greeting = greeting;
7.模块导出两种方式的联系和区别
exports时module.exports的别名(地址引用关系),导出对象最终以module.exports为准
五、系统模块
1.什么是系统模块
Node运行环境提供的API为系统模块
2.系统模块fs 文件操作
fs:文件操作系统
const fs=require('fs');
-
读取文件内容
fs.readFile('文件路径/文件名称',['文件编码'], callback); fs.readFile('...','utf-8',(err,doc) => { //如果文件读取发生错误 参数err的值为错误对象 否则err的值为null //doc参数为文件内容 if(err == null){ //控制台中输出文件内容 console.log(doc); } });
-
写入内容操作
fs.writeFile('文件路径/文件名称','数据', callback); const fs = require('fs'); const content = '<h3>正在使用writeFile写入文件内容</h3>'; fs.writeFile('./01.HelloWord.js', content, err => { if (err != null) { console.log(err); return; } console.log('文件写入成功'); })
3.系统模块path 路径操作 -- 路径拼接
4.路径拼接语法
path.join('路径','路径',....)
//导入path模块
const path = require('path');
//路径拼接
let finalPath=path.join('itcast','a','b','c.css');
//输出结果itcast\a\b\c.css
console.log(finalPath);
5.相对路径VS绝对路径
- 大部分使用绝对路径
- 使用__dirname获取当前文件所在的绝对路径 然后用path模块拼接
六、第三方模块
1.什么是第三方模块
有特定功能,直接使用的模块,多个文件组成,文件夹中,及包两种存在形式
- 以js文件的形式存在,提供实现项目具体功能的API接口
- 以命令行模块形式存在,辅助功能
2.获取第三方模块
npmjs.com 第三方模块网址
- 下载:
npm install 模块名称
- 卸载:
npm uninstall package 模块名称
全局安装与本地安装 - 命令行工具:全局安装
- 库文件:本地安装
3.第三方模块 nodemon : 命令行工具
使用步骤
- 使用
npm install nodemon -g
下载 - 在命令行工具中用
nodemon
命令代替node
命令行工具中:ctrl + c
终止操作
4.第三方模块 nrm :npm下载地址切换工具
国内下载速度慢,专门服务器去同步
使用步骤:
- 使用
npm install nrm -g
下载 - 查询可用下载地址列表
nrm ls
- 切换npm下载地址
nrm use 下载地址名称
5.第三方模块 Gulp
基于node平台开发的前端构建工具
6.Gulp能做什么
- 项目上线,HTML,CSS,JS文件压缩合并
- 语法转换(es6,less..)
- 公共文件抽离
- 修改文件浏览器自动刷新
7.Gulp使用
- 使用
npm install gulp
下载 - 在项目根目录下建立gulpfile.js文件
- 重构项目的文件夹结构src 目录放置源代码文件 dist目录放置构建后文件
- 在gulpfile.js文件中编写
- 命令行执行文件
8.Gulp中提供的方法
-
gulp.src()
:获取任务要处理的文件 -
gulp.dest()
:输出文件 -
gulp.task()
:建立gulp任务 -
gulp.watch()
:监控文件的变化//引用gulp模块 const gulp = require('gulp'); //使用gulp.task建立任务 //参数1:任务名称 //参数2:回调函数 gulp.task('first', () => { console.log('人生中的第一个gulp任务执行了'); //1.使用gulp.src 获取要处理的文件 gulp.src('./src/css/base.css') .pipe(gulp.dest('dist/css')); });
然后在命令行中下载 gulp-cli -g
全局安装
然后 gulp first
执行js文件
9.Gulp插件 ------下载 引用 调用
gulp-htmlmin
: html文件压缩gulp-csso
:压缩cssgulp-babel
:js语法转化gulp-less
:less语法转化gulp-uglify
:压缩混淆jsgulp-file-include
公共文件包含browsersync
浏览器实时同步
七、package.json文件
1.node_modules文件夹的意思
传输速度慢,版本得一致否则会报错
2.package.json文件的作用
项目描述文件,记录当前项目信息... 使用 npm init -y
命令生成
3.项目依赖:npm install --production
"dependencies": {
"formidable": "^1.2.2",
"gulp": "^4.0.2",
"mime": "^2.5.0"
}
注意:npm install
这个会将第三方模块全部下载
4.开发依赖:项目开发阶段需要依赖,线上运营阶段不需要依赖的第三方包
npm install gulp --save-dev
"devDependencies": {
"gulp": "^4.0.2"
}
5.package-lock.json的作用
- 锁定包的版本,确保下次下载时不会因为版本产生问题
- 加快包的下载速度
别名的用法
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build": "nodemon app.js"
},
命令行中:npm run build
八、Node.js中模块的加载机制
1.模块查找规则-当模块有路径但没有后缀时 ----require('./find.js');
find.js --> find 文件下的index.js文件 --> package.json文件查找main选项中的入口文件 --> 报错
2.模块查找规则-当模块没有路径但没有后缀时 ---require('find');
*Node.js会假设它是系统模块 -->在node_modules中找同名js文件 -->find 文件下的index.js文件 --> package.json文件查找main选项中的入口文件 --> 报错
八、服务器端基础概念
- 网站的组成:客户端和服务器端
- Node网站服务器:接收请求和响应请求
- IP地址:互联网中设备的唯一标识 互联网协议地址
- 域名:上网所使用的网址
- 端口:计算机与外界通讯交流的出口,用来区分服务器电脑中提供不同的服务
- URL:及网页地址
- URL的组成: 传输协议://服务器IP或域名:端口/资源所在位置标识
- 开发过程中客户端和服务器端说明
开发人员电脑: 浏览器+Node
本地域名:
locallhost
本地IP:127.0.0.1
九、创建web服务器
//用于创建网站服务器的模块
const http = require('http');
//app对象就是网站服务器对象
const app = http.createServer();
//当客户端有请求来的时候
app.on('request', (req, res) => {
res.end('<h2>hello user</h2>');
});
//监听端口
app.listen(3000);
console.log('网站服务器启动成功');
nodemon app.js
//更新js文件自动执行
十、HTTP协议
1.HTTP协议的概念:超文本传输协议
2.报文
3.请求报文
1.请求方式(Request Method)
- GET 请求数据
- POST 发送数据
- 获取请求方式:
req.method
2.请求地址 (Request URL)
- 获取请求地址:
req.url
- 获取请求报文信息:
req.headers
4.响应报文
1.HTTP状态码
- 200 请求成功
- 404 请求的资源没有找到
- 500 服务器端错误
- 400 客户端请求有语法错误
res.writeHead(400);
2.内容类型
5.HTTP请求与响应处理
1.请求参数 比如登录操作
2.GET请求参数
-
参数被放置在浏览器地址栏中
//内置模块 url 用于处理url地址 const url = require('url'); //1)要解析的url地址 //2)将查询参数解析成对象形式 let { query, pathname } = url.parse(req.url, true); // console.log(url.parse(req.url, true).query); console.log(query.name); console.log(query.age);
3.POST请求参数
- 参数被放置在请求体中进行传输
- 获取POST参数需要使用data事件和end事件
- 使用querystring系统模块的参数转换为对象格式 4.路由 :指客户端请求地址与服务器端程序代码的对应关系
5.静态资源:不需要服务器端处理,直接响应给用户,如 html css js等
6.动态资源:相同的请求地址不同的响应资源
十一、Node.js 异步编程
1.同步API,异步API
- 同步API:只有当前API执行完成后,才能继续执行下一个API
- 异步API:当前API的执行不会阻塞后续代码的执行
2.同步API,异步API的区别(获取返回值)
同步API可以从返回值中拿到API执行的结果,但异步API不可以
3.回调函数
function getMsg(callback) {
setTimeout(() => {
callback({
msg: 'hello node.js'
})
}, 2000);
}
getMsg(function(data) {
console.log(data);
})
4.同步API,异步API的区别(代码执行顺序)
异步APO不会等待API执行完成后再向下执行代码
5.Node.js中的异步API
文件读取 / 事件监听API
6.Promise
解决Node.js异步编程中回调地狱的问题
7.异步函数:异步代码写出同步的形式
const fn =async () => {};
async function fn() {};
- 在普通函数定义的前面加上
async
关键字 变成了异步函数 - 异步函数默认的返回值是
promise
对象 - 在异步函数内部使用
return
关键字进行结果返回 结果会被包裹在promise
对象中 return关键字代替了resolve方法 - 在异步函数中使用
throw
关键字抛出程序异常 - 调用异步函数再链式调用
then
方法获取异步函数执行结果 - 调用异步函数再链式调用
catch
方法获取异步函数执行错误信息
await 关键字
- 只能出现在异步函数中
await promise
它可以暂停异步函数的执行 等待promise对象返回结果后在想下执行