Node和Nodejs是什么
Node是一个基于Chrome V8引擎的javaScript代码运行环境
Node.js是运行在代码环境之上的语言
JavaScript代码运行在浏览器中,JavaScript是语言,浏览器是运行环境
JavaScript代码运行在Node 中,Node.js是语言,Node是运行环境
Nodejs的安装
在官网进行安装https://nodejs.org/en/download/一直下一步就行了
安装完成后,window健+r 弹出运行窗口,输入cmd或者powershell打开命令行窗口,输入 node -v 来查看是否安装成功
Node环境安装失败的解决办法
1.
错误代码2502,2503:表示系统账户权限不足
解决办法: 以管理员身份运行powershell命令行工具 输入运行安装包命令 msiexec /package node安装包位置
执行node -v时报错 显示无法识别:表示Node安装时环境变量写入失败
解决办法:
进入点击计算机属性>高级系统设置>高级>环境变量>Path中添加环境变量
我这是win10系统,win7也是直接在Path中添加,但是win7需要在最后面加分号,把你安装Nodejs的路径添加进去
比如:C:\Program Files\nodejs\
Node.js 的组成和基础语法
JavaScript 由三部分组成,ECMAScript,DOM,BOM。 Node.js是由ECMAScript及Node
环境提供的一些附加API组成的,包括文件、网络、路径等等一些更加强大的 API。
所有ECMAScript语法在Node环境中都可以使用 在Node环境下执行代码,使用Node命令执行后缀为.js的文件即可
切换文件目录比较麻烦,可以当当前工作空间里面按住 shift健 加鼠标右键,选择 此处打开命令窗口
在浏览器中全局对象是window,在Node中全局对象是global。
Node.js模块化开发
JavaScript在使用时存在两大问题,文件依赖和命名冲突
Node.js规定一个JavaScript文件就是一个模块,模块内部定义的变量和函数默认情况下在外部无法得到
模块内部可以使用exports对象进行成员导出, 使用require方法导入其他模块。
模块导出的两种方式
第一种方式
const add = (n1, n2) => n1 + n2;
exports.add = add;
第二种方式
const greeting = name => `hello ${name}`;
module.exports.greeting = greeting;
导出
const a = require('./03.module-a');
console.log(a.add(10, 20));
exports是module.exports的别名(地址引用关系),导出对象最终以module.exports为准,所以我们在使用的时候就需要去注意,如果 exports 跟 model.exports 指向的是同一个对象,那么不会出问题
系统模块
Node运行环境提供的API. 因为这些API都是以模块化的方式进行开发的, 所以我们又称Node运行环境提供的API为系统模块
fs文件操作
读取文件
1.获取系统 fs 模块
const fs = require('fs');
2.通过模块内部的readFile读取文件内容
fs.readFile('./01.helloworld.js', 'utf8', (err, doc) => {
// 如果文件读取出错err 是一个对象 包含错误信息
// 如果文件读取正确 err是 null
// doc 是文件读取的结果
console.log(err);
console.log(doc);
});
写入文件
fs.writeFile('./demo.txt', '即将要写入的内容', err => {
if (err != null) {
console.log(err);
return;
}
console.log('文件内容写入成功');
})
path 路径操作
1.导入path模块
const path = require('path');
2.路径拼接
// 路径拼接
let finialPath = path.join('itcast', 'a', 'b', 'c.css');
// 输出结果 itcast\a\b\c.css
console.log(finialPath);
- 大多数情况下使用绝对路径,因为相对路径有时候相对的是命令行工具的当前工作目录
- 在读取文件或者设置文件路径时都会选择绝对路径
- 使用__dirname获取当前文件所在的绝对路径
Nodejs第三方模块
下载和删除
使用 npm 命令:npm (node package manager) : node的第三方模块管理工具
下载:npm install
模块名称 卸载:npm unintall package 模块名称
nodemon 模块
nodemon是一个命令行工具,用以辅助项目开发。
在Node.js中,每次修改文件都要在命令行工具中重新执行该文件,非常繁琐,而使用这个模块,可以帮我们监听这个文件的修改,只要修改保存了,就会重新执行一次。 使用-g全局下载它
nrm 模块
npm下载地址切换工具
使用npm install nrm –g 下载它
查询可用下载地址列表 nrm ls
切换npm下载地址 nrm use 下载地址名称
Gulp模块
项目上线,HTML、CSS、JS文件压缩合并
语法转换(es6、less …)
公共文件抽离
修改文件浏览器自动刷新
Gulp插件
gulp-htmlmin :html文件压缩
gulp-csso :压缩css
gulp-babel :JavaScript语法转化
gulp-less: less语法转化
gulp-uglify :压缩混淆JavaScript
gulp-file-include 公共文件包含
browsersync 浏览器实时同步
package.json文件的作用
项目描述文件,记录了当前项目信息,例如项目名称、版本、作者、github地址、当前项目依赖了哪些第三方模块等。
使用npm init -y命令生成。
模块加载机制
1.拥有路劲却没有后缀
1.require方法根据路径进行查找,如果说是完整路径,就直接引入模块
2.如果没有后缀,先找同名JS文件再找同名JS文件夹
3.找文件夹中index.js否则去package.js中查找main选项确定入口文件(如果index.js 和main的入口函数都有,那么就会先执行main的入口函数)
4.没有找到就会报错
2.接收不带路径的模块名字
Node.js会假设它是系统模块
Node.js会去node_modules文件夹中
首先看是否有该名字的JS文件 再看是否有该名字的文件夹
查看该文件夹中的package.json中的main选项确定模块入口文件
如果没有入口文件看里面是否有index.js 否则找不到报错
构建HTTP服务器
1.引入系统模块http
const http = require('http');
2.创建web服务器
const app = http.createServer();
3.当客户端发送请求的时候(监听客户端发送过来的请求)
app.on('request', (req, res) => {
// 响应
res.end('<h1>hi, user</h1>');
});
4.监听端口号
app.listen(3000);
console.log('服务器已启动,监听3000端口,请访问 localhost:3000')
请求参数
get请求
参数被放置在浏览器地址栏中,例如:http://localhost:3000/name=zhangsan&age=20
参数获取需要借助系统模块url,url模块用来处理url地址
const http = require('http');
// 导入url系统模块 用于处理url地址
const url = require('url');
const app = http.createServer();
app.on('request', (req, res) => {
// 将url路径的各个部分解析出来并返回对象
// true 代表将参数解析为对象格式
let {query} = url.parse(req.url, true);
console.log(query);
});
app.listen(3000);
post请求
参数被放置在请求体中进行传输
获取POST参数需要使用data事件和end事件
使用querystring系统模块将参数转换为对象格式
// 导入系统模块querystring 用于将HTTP参数转换为对象格式
const querystring = require('querystring');
app.on('request', (req, res) => {
let postData = '';
// 监听参数传输事件
req.on('data', (chunk) => postData += chunk;);
// 监听参数传输完毕事件
req.on('end', () => {
console.log(querystring.parse(postData));
});
});
app.listen(3000);
路由
指的是客服端请求地址和服务端程序代码的对应关系,
路由是指URL地址与程序的映射关系,更改URL地址可以改变程序的执行结果。简单说就是请求什么响应什么。
// 当客户端发来请求的时候
app.on('request', (req, res) => {
// 获取客户端的请求路径
let { pathname } = url.parse(req.url);
if (pathname == '/' || pathname == '/index') {
res.end('欢迎来到首页');
} else if (pathname == '/list') {
res.end('欢迎来到列表页页');
} else {
res.end('抱歉, 您访问的页面出游了');
}
});
Node.js中的Promise
Promise出现的目的是解决Node.js异步编程中回调地狱的问题
异步函数是异步编程语法的终极解决方案,它可以让我们将异步代码写成同步的形式,让代码不再有回调函数嵌套,使代码变得清晰明了。
async关键字
1.它只能出现在异步函数中
2.后面只能写promise对象 其他类型的API都不可以
3.await promise它可以暂停异步函数的执行 等待promise对象返回结果后再向下执行函数
Express框架
提供了方便简洁的路由定义方式
对获取HTTP请求参数进行了简化处理
对模板引擎支持程度高,方便渲染动态HTML页面
提供了中间件机制,有效控制HTTP请求
拥有大量第三方中间件对功能拓展
下载Express第三方模块
npm install express
使用Express创建服务器
//1.引入 express模块
const express = require('express');
//2.创建web服务器
const app = express();
//4.监听get请求
app.get('/', (res, req) => {
//5.响应页面,利用send方法相应
req.send('请求成功');
});
//4.监听post请求
app.post('/', (res, req) => {
//5.响应页面
req.send('请求成功');
});
//3.监听端口
app.listen(8080);
console.log('链接成功');
路由模块化
// 引入express框架
const express = require('express');
// 创建网站服务器
const app = express();
// 创建路由对象
const home = express.Router();
// 为路由对象匹配请求路径
app.use('/home', home);
// 创建二级路由,用户必须要访问到二级路由才能匹配到相应的回调
home.get('/index', (req, res) => {
res.send('欢迎来到博客首页页面')
});
// 端口监听
app.listen(3000);
静态资源
通过 Express 内置的 express.static 可以方便地托管静态文件,例如图片、CSS、JavaScript 文件等。
app.use(express.static('public'));
现在,public 目录下面的文件就可以访问了。
http://localhost:3000/images/kitten.jpg
http://localhost:3000/css/style.css
http://localhost:3000/js/app.js
http://localhost:3000/images/bg.png
http://localhost:3000/hello.html
参数处理
接收地址栏中问号后面的参数
// 例如: http://localhost:3000/?name=zhangsan&age=30
console.log(req.query); // {“name”: “zhangsan”, “age”: “30”}
Express中接收post请求参数需要借助第三方包 body-parser
const bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({ extended: true }));
req.body // post请求参数
模板引擎
Express框架没有内置模板引擎,但是对其他模板引擎提供了良好的支持,比如art-template。
为了使art-template模板引擎能够更好的和Express框架配合,模板引擎官方在原art-template模板引擎的基础上封装了除了express-art-template。
使用方法
var express = require('express');
var app = express();
// 告诉Express框架 使用art-template模板引擎渲染HTML模板
app.engine('html', require('express-art-template'));
// 当render方法渲染模板时, 如果模板后缀被省略, 则将html作为默认的文件后缀
app.set('view engine', 'html');
// 当render方法渲染模板时, 如果模板所在路径被省略, 则在内部会自动将以下路径进行拼接
// 设置模板所在目录
app.set('views', path.join(__dirname, 'views'));
app.get('/', function (req, res) {
res.render('index.art', {
user: {
name: 'aui',
tags: ['art', 'template', 'nodejs']
}
});
});