回顾Node服务器端开发

952 阅读10分钟

一、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.运行

image.png 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 : 命令行工具

使用步骤

  1. 使用npm install nodemon -g 下载
  2. 在命令行工具中用nodemon 命令代替node 命令行工具中:ctrl + c 终止操作

4.第三方模块 nrm :npm下载地址切换工具

国内下载速度慢,专门服务器去同步

使用步骤:

  1. 使用npm install nrm -g 下载
  2. 查询可用下载地址列表 nrm ls
  3. 切换npm下载地址 nrm use 下载地址名称

5.第三方模块 Gulp

基于node平台开发的前端构建工具

6.Gulp能做什么

  • 项目上线,HTML,CSS,JS文件压缩合并
  • 语法转换(es6,less..)
  • 公共文件抽离
  • 修改文件浏览器自动刷新

7.Gulp使用

  1. 使用npm install gulp 下载
  2. 在项目根目录下建立gulpfile.js文件
  3. 重构项目的文件夹结构src 目录放置源代码文件 dist目录放置构建后文件
  4. 在gulpfile.js文件中编写
  5. 命令行执行文件

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:压缩css
  • gulp-babel:js语法转化
  • gulp-less:less语法转化
  • gulp-uglify:压缩混淆js
  • gulp-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 发送数据
  1. 获取请求方式:req.method

2.请求地址 (Request URL)

  1. 获取请求地址:req.url
  2. 获取请求报文信息: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对象返回结果后在想下执行