携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第4天,点击查看活动详情
一、Node.js基础
1、认识Node.js
特性
- Nodejs语法完全是js语法,只要你懂js基础就可以学会Nodejs后端开发
- NodeJs超强的高并发能力,实现高性能服务器
- 开发周期短、开发成本低、学习成本低
使用nodejs需要了解多少JavaScript
浏览器环境 vs node环境
- 浏览器和 Node.js 都使用 JavaScript 作为其编程语言。
- 在浏览器中,您所做的大部分时间都是与 DOM 或其他 Web 平台 API(如 Cookies)进行交互。 这些当然在 Node.js 中不存在,没有浏览器提供的
document、window和所有其他对象。
- 在浏览器中,不能使用Node.js 通过其模块提供的所有友好的 API,比如文件系统访问功能。
- Node.js 使用 CommonJS 模块系统,浏览器使用 ES Modules 标准。
- Node.js 中使用
require()引入模块,在浏览器中使用import。
2、搭建开发环境
下载
建议下载你所访问时的长期支持版本,安装很简单,一直下一步即可,注意安装路径不要有中文。
配置环境变量,在cmd中输入 node -v 出现版本号即为安装成功。
安装nvm
主要用来管理NodeJS版本,可以方便的切换不同的NodeJS版本。
使用管理员身份打开cmd,执行 npm install nvm -g 等待下载安装,再次输入 nvm -v 出现版本号即为安装成功,
| 常用命令 | 描述 |
|---|---|
| nvm v或version | 查看当前的nvm版本 |
| nvm list | 列出所有安装的版本 |
| nvm list available | 列出所有远程服务器的版本 |
| npm install 具体版本号 | 安装指定版本的node |
| nvm uninstall 具体版本号 | 卸载指定版本的node |
| nvm use 具体版本号 | 切换使用指定的版本 |
| nvm current | 显示当前使用的版本 |
npm简介
npm init
npm install 包名 –g (uninstall,update)
npm install 包名 --save-dev (uninstall,update)
npm list -g (不加-g,列举当前目录下的安装包)
npm info 包名(详细信息) npm info 包名 version(获取最新版本)
npm install md5@1(安装指定版本)
npm outdated( 检查包是否已经过时)
"dependencies": { "md5": "^2.1.0" } ^ 表示 如果 直接npm install 将会 安md5
2.*.* 最新版本
"dependencies": { "md5": "~2.1.0" } ~ 表示 如果 直接npm install 将会 安装md5 2.1.* 最新版本
"dependencies": { "md5": "*" } * 表示 如果 直接npm install 将会 安装 md5 最新版本
安装 nrm
NRM (npm registry manager)是npm的镜像源管理工具,有时候国外资源太慢,使用这个就可以快速地在 npm 源间切换。
手动切换方法: npm config set registry https://registry.npm.taobao.org
- 安装 nrm:
npm install -g nrm,全局安装nrm。
- 使用 nrm:执行命令
nrm ls查看可选的源。 其中,带*的是当前使用的源,上面的输出表明当前源是官方源。
- 切换 nrm:如果要切换到taobao源,执行命令
nrm use taobao
- 测试速度:你还可以通过
nrm test测试相应源的响应时间。
二、内置模块
http模块
http模块的作用是提供Http服务。
新建app.js,创建一个HTTP服务:
//导入http模块
const http = require('http');
//createServer()创建web服务实例
const server = http.createServer();
/**
* @description: 监听请求事件
* @param {*} request 请求事件
* @param {*} req 请求对象
* @param {*} res 响应对象
* @return {*} 返回给前端的数据
*/
server.on('request', (req, res) => {
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({
data: 'Hello World!'
}));
});
/**
* @description: 启动服务器
* @return {*}
*/
server.listen(3000);
在终端启动 node app.js
此时在浏览器访问 http://localhost:3000 就能看到后端返回的数据
req请求对象
req对象是前端发起请求时的对象
| 属性 | 描述 |
|---|---|
| req.url | 请求资源路径及参数 |
| req.method | 请求方式 |
| req.headers | 请求头信息 |
res响应对象
res是后端响应后的对象
| 属性 | 描述 |
|---|---|
| res.end(数据) | 返回给前端的数据 |
| res.writeHead(200, { 'Content-Type': 'application/json' }); | 响应头信息,状态码和返回数据类型 |
根据不同请求地址返回不同的信息
新建app.js:
const http = require('http');
//导入module.js文件中导出的方法
const module = require('./modules/module.js');
//创建本地服务器来接收数据
const server = http.createServer((req, res) => {
//如果请求地址是'/favicon.ico',直接返回
if(req.url === '/favicon.ico') {
return;
}
res.writeHead(module.readerStatus(req.url), { "Content-Type": "text/html;charset=utf-8" });
res.write(module.readerHTML(req.url));
res.end();
}).listen(3000, ()=>{
console.log("http://localhost:3000");
});
新建modules目录,新建module.js
/**
* @description: 根据请求地址返回状态码
* @param {*} url 请求地址
* @return {*} 状态码
*/
function readerStatus(url){
let arr = ["/","/home","/list"];
return arr.includes(url) ? 200 : 404;
}
/**
* @description: 根据请求地址返回页面信息
* @param {*} url 请求地址
* @return {*} 页面信息
*/
function readerHTML(url) {
switch(url){
case "/home":
case "/":
return `
<html>
<div>这是home页面</div>
</html>
`;
case "/list":
return `
<html>
<div>这是list页面</div>
</html>
`;
default:
return `
<html>
<div>404 not found</div>
</html>
`
}
}
//导出方法
module.exports = {
readerHTML,
readerStatus
}
启动服务 node app.js
打开浏览器输入对应url地址就会返回不同页面信息
但是这时会发现一个问题,在地址栏输入http://localhost:3000/list?name=aa&age=20
前端带参数请求
list时返回给我的却是404,要解决这个问题就要用到url模块。