1193-前端面试加分福音--node基础
https://www.imooc.com/learn/1193
简介:系统的学习NodeJS的基础,熟练使用Node的核心API,了解node的运行过程,学会搭建自己的服务器,并实现我们常见的登录、注册功能,揭开后端开发的神秘面纱。
第1章 课程介绍
1-1 课程简介 (08:47)
为什么要学node
- 使自己更全面,有大局观
- 提升话语权
- 升职加薪的筹码
Node的作用和应用
- 脱离浏览器运行JS
- 后台API编写
- Webpack、Gulp、Npm等等
- 中间层:服务器中负责IO读写的中间层服务器
Node的优点:
- 性能、异步IO、处理数据、安全性
1-2 学习目标 (03:35)
登陆、注册案例
前置知识:HTML+CSS、JavaScript
第2章 Node介绍
2-1 Node的优势 (05:36)
- 便于前端开发入门
- 性能高
- 利于前端代码的整合
2-2 Node环境搭建和运行 (06:35)
Node官网:https://nodejs.org/
Node环境搭建
- 官网上下载node-v-xx.msi傻瓜式的安装包。一路下一步安装完成。
- 检测是否安装成功:
node -v
- 运行程序:
node xxx.js
2-3 npm和包 (13:20)
NPM包管理器:
NPM:node package management
- package.json
- NPM、CNPM
- npm常用命令
没有包管理器的时候:
<script src="js/jquery.js"/>
<script src="js/swiper.js"/>
<script src="js/fastclick.js"/>
CNPM安装
npm install -g cnpm --registry=https://registry.npm.taobao.org
NPM常用命令:
npm init # 初始化
npm install xxx # 安装
npm i xxx
npm uninstall xxx # 删除
npm un xxx
npm update xxx # 更新
npm install # 安装
npm i
第3章 Node的模块
- 全局模块(对象)process
- 系统模块
- 自定义模块
3-1 Node中的模块:全局模块 (10:34)
定义:何时何地都能访问,不需要引用
process.env:环境变量
代码
console.log(process.env);
命令
node index.js
结果
{ TERM: 'xterm-256color', SHELL: '/bin/bash', CLICOLOR: '1', TMPDIR: '/var/folders/jd/4db9g3vs0c57f0_fwtj6nkfc0000gn/T/', Apple_PubSub_Socket_Render: '/private/tmp/com.apple.launchd.gNREVjs4ne/Render', USER: 'tuyuankun', SSH_AUTH_SOCK: '/private/tmp/com.apple.launchd.rYrS6hZYR9/Listeners', __CF_USER_TEXT_ENCODING: '0x1F5:0x19:0x34', LSCOLORS: 'gxfxaxdxcxegedabagacad', PATH: '/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Develop/applications/apache-maven-3.6.2/bin:/Develop/applications/elasticsearch-7.3.1/bin:/Develop/applications/elasticsearch-head', TERMINAL_EMULATOR: 'JetBrains-JediTerm', PWD: '/Develop/learn-imooc/1193-node-base', XPC_FLAGS: '0x0', XPC_SERVICE_NAME: '0', M2_HOME: '/Develop/applications/apache-maven-3.6.2', SHLVL: '1', HOME: '/Users/tuyuankun', LOGNAME: 'tuyuankun', LC_CTYPE: 'zh_CN.UTF-8', OLDPWD: '/Develop/learn-imooc/1193-node-base/js', _: '/usr/local/bin/node' }
process.argv:运行参数
代码
console.log(process.argv);
命令
node index.js a b c
结果
[ '/usr/local/Cellar/node/12.10.0/bin/node', '/Develop/learn-imooc/1193-node-base/index.js', 'a', 'b', 'c' ]
简易计算器:
let num1 = parseInt(process.argv[2]); let num2 = parseInt(process.argv[3]); console.log(num1 + num2);
node index.js 34 43
77
__dirname:当前目录名称
3-2 Node中的模块:系统模块 (13:54)
定义:需要require(),但不需要单独下载
path:用于处理文件路径和目录路径的实用工具
var path = require('path');
path.dirname("/node/a/c/c/1.jpg")// 文件夹名称 path.basename("/node/a/c/c/1.jpg")// 文件名称 path.extname("/node/a/c/c/1.jpg")// 文件后缀名称 path.resolve("/node/a/b/c", "../../", "d")// /node/a/d path.resolve(__dirname, "index.js")// index.js的绝对路径
f s:用于文件读写操作
var fs = require("fs");
写操作:
fs.writeFile("fs.write.txt", "刚下飞机", function (err) { if (err) { throw err; } }); // 同步 fs.writeFileSync("fs.writeSync.txt", "分割线");
读操作:
fs.readFile("js/helloworld.js", function (err, data) { if (err) { console.log(err); } else { console.log(data.toString()); } } ); // 同步 var data = fs.readFileSync("js/helloworld.js");
追加文件
fs.writeFile("fs.write.txt", "年入百万", {flag: "a"}, function (err) { if (err) { throw err; } });
fs.appendFile("fs.write.txt", "泻药", function (err) { if (err) { throw err; } });
3-3 Node中的模块:自定义模块 (07:23)
定义:require自己封装的模块
- exports
- module
- require
/* mod.js */
// 1. 参数
/*exports.a = 1;
exports.b = 2;
var c = 3;*/
// 2. 对象
/*module.exports = {
a: 1,
b: 2
};*/
// 3. 方法
/*module.exports = function () {
console.log("module.exports function");
};*/
// 4. 类
module.exports = class {
constructor(name) {
this.name = name;
}
show() {
console.log(this.name);
}
};
/* exports.js */
const mod = require("./mod");
/*console.log(mod.a);// 1
console.log(mod.b);// 2
console.log(mod.c);// undefined*/
/*mod();*/
let tuyrk = new mod("tuyrk");
tuyrk.show();
require()
- 如果有路径,就去路径里面找
- 没有的话就去node_modules里面找
- 路径下没有模块,就去node的安装目录里面找。
3-4 核心:http模块 (11:21)
服务器对象:
http.createServer()
let fs = require("fs");
let path = require("path");
let http = require("http");
http.createServer((req, res) => {
/*console.log("我来了。");*/
/*res.write("index");
res.end();*/
console.log(req.url);
fs.readFile(`./${req.url}`, (err, data) => {
if (err) {
console.log(err);
res.writeHead(404);
res.end("404 not found");
} else {
res.writeHead(200);
res.end(data);
}
});
}).listen(8888);
<p>我是http.html</p>
<img src="../imgs/avatar.jpeg" alt="avatar.jpeg">
第4章 Node中的数据交互
4-1 GET请求 (13:32)
客户端与服务器交互的东西称为报文。
报文分为:报文头(信息,<=32K)、报文体(数据<2G)。
请求方式:GET、POST、PUT、DELETE
GET请求
- 什么是GET请求?主要是获取数据。一次性传输数据
- 数据是放在URL里面进行传输。报文头。
- 容量小:<32K
let http = require("http");
let url = require("url");
http.createServer(((req, res) => {
console.log(req.url);
// 1. 无url模块,原始处理方法
/*let [url, query] = req.url.split('?');
console.log(url, query);*/
// 2. 使用url模块处理路径与参数
let {pathname, query} = url.parse(req.url, true);
console.log(pathname, query);
})).listen(8888);
<form action="http://localhost:8888/aaa" method="get">
用户名:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
<input type="submit" value="提交">
</form>
4-2 POST请求 (12:34)
POST请求
分段传输数据
数据是放在body里边进行传输。报文体
容量大:2G
let http = require("http");
let querystring = require("querystring");
http.createServer(((req, res) => {
let result = [];
req.on("data", buffer => {
result.push(buffer);// 分段传输数据,多次执行添加
});
req.on("end", () => {// 数据处理完成
let data = Buffer.concat(result).toString();// 数组转buffer
console.log(querystring.parse(data));// 处理queryString
})
})).listen(8888);
<form action="http://localhost:8888/aaa" method="post">
用户名:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
<input type="submit" value="提交">
</form>
总结:
- GET
- url?username=xxx&password=xxx
- 32K
- url模块
url.parse(req.url, true)
- POST
- 放在请求体
- 2G
- querystring模块
querystring.parse(data)
第5章 案例
5-1 接口(API) (05:59)
登录框:登陆、注册
接口设计
- 什么是接口(API):不同功能层之间的通信规则称为接口
- 参数、返回值
登陆:
GET '/login'
username, password
{
err: 1,
msg: "密码错误"
}
注册:
POST '/reg'
5-2 项目:实现登录和注册 (30:08)
后台:
/*login.js*/
const http = require("http");
const url = require("url");
const querystring = require("querystring");
const fs = require("fs");
const path = require("path");
let user = {
admin: "123456"
};
http.createServer(((req, res) => {
// 获取数据
let uri, get, post;
if (req.method === "GET") {
let {pathname, query} = url.parse(req.url, true);
uri = pathname, get = query;
complete();
} else if (req.method === "POST") {
let arr = [];
uri = req.url;
req.on("data", buffer => {
arr.push(buffer);
});
req.on("end", () => {
post = querystring.parse(Buffer.concat(arr).toString());
complete();
});
}
// 业务操作
// function complete() {}
// 设置状态码、编码
function setHead() {
res.writeHead(200, {
"Content-Type": "text/plain;charset=utf-8"
});
}
})).listen(8888);
页面:
<!--login.html-->
<form>
用户名:<input type="text" id="username"><br>
密码:<input type="password" id="password"><br>
<button id="login">登陆</button>
<button id="reg">注册</button>
</form>
第6章 课程回顾与总结
6-1 总结扩展 (11:45)
作用:
- 写Web API
- 中间层
- 前端工程化的一些工具(webpack、gulp)
优势:
- 性能高
- 便于前端入手
npm命令:
package.json
npm i xxx
npm un xxx
三大模块
- 全剧模块
- 系统模块 require引入
- 自定义模块 自己封装 module.export
重点:http模块
http.createServer((req, res) => {
// ...
})
数据通信:
GET请求
url模块
url.parse(req.url, true);
POST请求
let arr = []; req.on("data", buffer => { arr.push(buffer); // ... }); req.on("end", () => { Buffer.concat(arr).toString(); }); querystring.parse(req.url); // username=tuyrk&password=123
登陆、注册
接口API、设计API
GET ‘/login’
参数:username,password string object
返回值:
{ err: 0, msg: "xxx" }
深入学习:express/koa2、MongoDB
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 tuyrk@qq.com
文章标题:1193-前端面试加分福音--node基础
文章字数:2.1k
本文作者:神秘的小岛岛
发布时间:2019-11-16, 21:34:53
最后更新:2019-11-18, 00:42:37
原始链接:https://www.tuyrk.cn/imooc/1193-node-base/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。