nodejs搭建静态资源服务器
- 浏览器中的所有外部资源路径,都会变成网络请求
- 一般的静态资源(css文件,图片,音视频)使用url路径拼接的方式来处理
//1.导入模块
const http = require('http');
const fs = require('fs');
const path = require('path');
//2.创建服务器
let server = http.createServer((req,res)=>{
//(1)请求:req
console.log(req.url);
//(2)处理
if( req.url == '/' ){
//读取html文件响应返回
fs.readFile( path.join(__dirname,'www','index.html'),(err,data)=>{
if(err) throw err;
//(3)响应:res
res.end(data);
});
}else if( req.url.indexOf('/resource') == 0 ){
fs.readFile( path.join(__dirname,'www',req.url),(err,data)=>{
if(err) throw err;
//(3)响应:res
res.end(data);
});
}else{//错误路径
res.end('404 not found');
}
});
//3.开启服务器
server.listen(3000,()=>{
console.log('服务器开启成功');
});
nodejs接收get与post参数
Nodejs获取get请求参数
在http协议中,一个完整的url路径如下图
- 通过下图我们可以得知,get请求的参数是直接在url路径中显示。
- get的请求参数在path资源路径的后面添加,以?表示参数的开始,以key=value表示参数的键值对,多个参数以&符号分割
- hash部分表示的是资源定位符(滚动网页可视区域),由浏览器自动解析处理,它的作用是跳转到对应id的标签的位置
- get参数解析原理是 字符串切割
- 第一个参数:要切割的url字符串 第二个参数:布尔类型 默认false:query不处理 true:query处理成对象
let obj = url.parse( req.url,true );
-
前端发送get请求: 直接在url后面拼接 url?key1=value1&key2=value2
-
nodejs接收get请求参数
- 导入url模块
- 调用parse()方法解析参数: url.parse( req.url,true )
- 获取解析好的query属性 : get参数
//1.导入模块
const http = require('http');
const url = require('url');
//2.创建服务器
let server = http.createServer((req,res)=>{
//(1)get请求参数直接在url后面拼接
console.log( req.url );
//(2)get参数解析原理是 字符串切割
//第一个参数:要切割的url字符串 第二个参数:布尔类型 默认false:query不处理 true:query处理成对象
let obj = url.parse( req.url,true );
console.log(obj);
let {query} = obj;
console.log( query );
//响应返回参数:告诉客户端解析成功 (js对象需要转json对象才可以响应返回)
res.end( JSON.stringify(query) );
});
//3.开启服务器
server.listen(3000,()=>{
console.log('服务器开启成功');
});
Nodejs获取post请求参数
post请求特点
- post请求的参数是在请求体中,无法使用get的方式来接收post请求的参数
- post请求的参数无法一次获取,有可能是多次 原因:post可以提交大数据,而宽带有网络限制
- 前端发送post
1.1 需要设置请求头
1.2 请求体中发送: xhr.send(key=value) - nodejs接收post参数
2.1 给req注册data事件(接收数据包)
2.2 给req注册end事件(数据包接收完毕)
2.3 在end方法中使用querystring模块解析body
// 1.导入模块
const http = require('http');
// 解析get请求参数
const url = require('url');
// 解析post请求参数
const querystring = require('querystring');
// 2.创建服务器
let server = http.createServer((req, res) => {
console.log(req.url);
/* 箩筐思想
(1)给req注册data事件
客户端每发送一个数据包,这个事件就会触发一次(触发多次)
*/
let postData = '';
req.on('data', function (chunk) {
postData += chunk;
});
/*
(2)给req注册end事件
客户端每一次post所有的数据包发送完毕会执行一次
*/
req.on('end', () => {
// (3)处理post参数:使用querystring模块切割 请求体
console.log(postData);
let body = querystring.parse(postData);
console.log(body);
// 响应给客户端
res.end(JSON.stringify(body));
});
});
// 3.开启服务器
server.listen(3000, () => {
console.log('服务器开启成功');
});
post请求与get请求的区别
-
位置不同:
get是在url后面拼接(请求行)
post是在请求体中发送(请求体) -
大小不同:一般文件上传接口都是post
get发送数据有大小限制(一般是1MB)
post发送数据没有大小限制 -
速度不同
get速度比post快 -
安全性不同:一般登录注册都是post
post比get安全
Express
Express是NodeJS开发中一个非常重量级的第三方框架,它对于NodeJS服务端就相当于Jquery对于HTML客户端。
Express一个非常重要的亮点就是它没有改变nodejs已有的特性,而是在它的基础上进行了拓展也就是说,使用Express你既可以使用nodejs原生的任何API,也能使用Express的API
官网地址:
Express的github地址:
https://github.com/expressjs/express
Express三大核心功能
-
托管静态资源
-
路由(前端人员的接口文档)
- express自带路由功能,让Node服务端开发变得极其简单
- express支持链式语法,可以让代码看起来更加简洁
-
中间件(相当于插件)
Express最为核心的技术和思想,万物皆中间件
Express基本使用
- npm使用流程
- 1.初始化:在当前nodejs项目中执行终端命名:
npm init -y
- 作用:生成一个pachage.json文件,帮你记录当前项目安装了哪些第三方模块及对应的版本号
- 2.安装:在当前nodejs项目中执行终端命名:
npm install 模块名
- 安装之后,你的项目目录会新增两个文件node_modules与package-lock.json
node_modules
:npm会自动将所有的第三方模块放入这个文件夹中。类似于前端的lib文件夹package-lock.json
:npm会自动记录第三方模块的下载地址,下一次安装或更新的时候直接从这个地址下载,速度更快(只是影响以后更新速度,不影响开发)pachage.json:
帮你记录当前项目安装了哪些第三方模块及对应的版本号
- 安装之后,你的项目目录会新增两个文件node_modules与package-lock.json
- 3.注意点:
- (1)使用npm文件夹路径不能有中文
- (2)使用cnpm安装第三方模块得时候需要添加 --save命令。
- 示例
- npm安装crawler : npm install crawler
- npm会自动执行–save,将下载路径保存到package-lock.json文件中
- cnpm安装crawler : cnpm install crawler --save
- npm安装crawler : npm install crawler
- 示例
- (3)优先建议使用npm命令来安装。 如果网速很慢导致无法安装第三方模块,建议使用以下两种方式
- a.优先建议 : 更改npm镜像源为淘宝服务器
- npm config set registry https://registry.npm.taobao.org/
- 查看当前npm得镜像源:npm config list
- b.使用cnpm命令来安装第三方模块
- a.优先建议 : 更改npm镜像源为淘宝服务器
第三方模块使用流程(适合所有第三方模块)
- 1.进npm官网搜索模块:https://www.npmjs.com/
- 2.按照官方文档要求安装模块npm install 模块名
- 3.复制粘贴官网代码(别人作者提前写好的)
第三方中间件使用
第三方中间件使用步骤一般都是固定两步
- 一: 安装 npm i xxxx(官网复制粘贴)
- 第三方中间件都需要使用npm安装,可以理解为是一种特殊的第三方模块
- 二: 使用 app.use(xxx)(官网复制粘贴)
爬虫实战
//仅供学习交流,切勿用做其他用途
//1.导入爬虫模块
var Crawler = require('crawler');
//2.创建爬虫对象
var c = new Crawler({
maxConnections: 10,
// This will be called for each crawled page
callback: function (error, res, done) {
if (error) {
console.log(error);
} else {
//爬虫成功回调
//将爬取到的网页DOM树赋值给jq的$ (目的:使用jq的语法来操作DOM树)
var $ = res.$;
let heroList = [];
$('.herolist>li').each((index, ele) => {
// ele:dom对象
// console.log(`名字:${$(ele).find('a').text()}`);
// console.log(`图片:${$(ele).find('img').attr('src')}`);
heroList.push({
name: $(ele).find('a').text(),
pic: $(ele).find('img').attr('src'),
});
});
console.log(heroList);
}
done();
},
});
//3.开始爬虫
// Queue just one URL, with default callback
c.queue('网址');
express搭建服务器
//1.导入模块 : 相当于http
const express = require('express');
//2.创建服务器
let app = express();
//3.开启服务器
app.listen(3000,()=>{
console.log('服务器启动成功');
});
express响应客户端数据 (4个步骤)
- express框架本质不是修改原生代码,而是在原生的基础上添加方法 (给req和res原型添加成员)
- 路由(接口文档):一个请求对应一个函数
(1)响应普通文本 : res.send(‘字符串’)
(2)响应json对象 : res.send( js对象 )
(3)响应html文件 : res.sendFile( 文件绝对路径 )
// 1.导入模块
const express = require('express');
// 2.创建服务器
let app = express();
// 3.路由(接口文档):一个请求对应一个函数
app.get('/', (req, res) => {
//响应普通文本
// 原生语法
// res.end('这是首页');
// express语法
res.send('这是首页');
});
app.get('/login', (req, res) => {
// 响应json:底层会自动将js对象转成json格式字符串
res.send({
username: 'admin',
password: 123456,
});
});
app.get('/list', (req, res) => {
// 响应html文件:文件的绝对路径
res.sendFile(`${__dirname}/list.html`);
});
app.use((req, res) => {
res.end('404');
});
// 4.开启服务器
app.listen(3000, () => {
console.log('服务器开启成功');
});
express托管静态资源(5个步骤)
const express = require('express');
//2.创建服务器
let app = express();
//3.托管静态资源
/*
(1)如果请求路径为/ , express会自动读取www下面index.html响应返回
(2)如果请求路径是以www中文件夹开头,express会自动根据url拼接路径返回
*/
app.use(express.static('www'));
//4.写路由(接口文档)
//5.开启服务器
app.listen(3000, () => {
console.log('服务器开启成功');
});
express接收get与post参数
// 1.导入模块
const express = require('express');
// 2.创建服务器
let app = express();
// 3.托管静态资源
app.use(express,static('www'));
// 4.配置中间件(jq的插件):本质都是给req或者res原型添加成员
// 4.1body-parser中间件:解析post参数
// (1)导入中间件
const bodyParse = require('body-parser');
// (2)使用中间件:给req添加body属性,储存解析好的post参数
app.use(bodyParse.urlencoded({extended:false}))
// 5.写路由(接口文档)
/*
接收get请求参数
req.query
*/
app.get('/hero/list',(req,res)=>{
console.log(req,url);
// 获取get参数:express会自动帮我们解析get参数并且添加到reqde 原型query属性中
console.log(req.query);
res.send(req.query)
});
/*
接收post请求参数
(1)使用body-parser插件
(2)req.body
*/
app.post('/hero/add',(req,res)=>{
console.log(req.url);
console.log(req.body);
res.send(req.body)
});
// 6.开启服务器
app.listen(3000,()=>{
console.log('服务器开启成功');
})