1.设置资源类型(mime类型)
meta标签和设置响应头的字符集谁的优先级更高,设置响应头的更高 对于外面资源js css图片没必要设置字符集,会自动根据网页的字符集设置。
2.新建serer.js
// 监听 本地服务的9000端口,可以获取 请求的方法url,可以根据
const http = require('http')
const fs = require('fs')
const server = http.createServer((request, response) => {
if(request.method !=='GET') {
response.ststusCode = 405
response.end('<h1>405 Method Not Allowed</h1>')
return
}
const { method, url } = request
let { pathname } = new URL(url, 'http://127.0.0.1')
let root = __dirname + '/page'
let filePath = root+ pathname
fs.readFile(filePath,(error,data)=>{
// error是nodejs文档可以查看 一个错误信息对象,根据不同的error.code 判断是404 还是403
})
response.end('hello')
})
server.listen(9000, () => {
console.log('服务已经启动');
})
3.get和post区别
1.作用不同,获取数据、post提交数据(不绝对)
2.参数位置,get一般是url后面以查询字符串参数,post放入请求体(不绝对)
3.安全性,get暴露在地址栏,post相对于get更安全,但也是相对,可以用fidder进行抓包post也不安全
4.请求大小限制,get一般为2k post没限制
4.模块化
1.概念
将一个复杂的程序文件按照一定规则(规范)拆分为多个文件的过程称之为模块化
1.减少了命名冲突2.高复用性3.高维护性
2.引入规则
module.exports = fn
module.exports = {name:fn}
exports.name = fn (不能写exports = 123 因为exports = module.exports = {})
get 请求的引入url中建议写url绝对路径(fs模块),因为相对路径会受工作目录的影响,
但是模块化引入不会受工作目录影响,所以相对路径更方便,但是./在此处不可省略。导入nodejs内部模块时可以省略
js和json文件后缀可省略(同名先取js,取不到才取json)
引入 const timo = require(./me.js)
3.引入文件夹
1 先检测文件夹下package.json文件中main属性对应的文件,如果存在则导入,反之如果文件不存在会报错
2 如果main属性不存在或者package.json不存在,尝试导入文件夹下的index.js和index.json还是找到会报错
4.导入模块的基本流程,require导入自定义模块的基本流程
1.将相对路径转化为绝对路径,定位目标文件
2.缓存检测
3.读取目标文件代码
4.包裹一个函数并执行(自执行函数),通过argument.callee.toString() 查看自执行函数(require的js文件是在一个函数中运行的,可以在modulue.exports 下面打印查看函数体)
5.缓存模块的值
6.返回module.exports的值
5.commonjs规范
上述的语法都是Commonjs规范中的内容,而node.js是实现了CommonJs模块化规范,二者关系有点像javascript与ECMAScript,前者实现了ecma规范
6.包管理工具
1.概念
英文名package,是众多底层代码的集合,常用的包管理工具有npm (nodejs内置)yarn cnpm
2.npm init 初始化包管理文件
初始化 package.json文件 name不能设置中文或者大小, 版本号要求以x.x.x数字格式,默认1.0.0 package.json也可以手动创建和修改 也可以通过npm init -y 快速创建。全部采取默认值(name为文件夹名称)
3 搜索包
1.直接cmd搜索 npm s math 2.npm官网
4 安装包
npm install ,前提是有package.json 生成nodemodules ,生成package-lock.json 固定版本信息的
5 require导入node模块的基本流程
寻找当前目录下node_modules中的同名目录(取packjson中的main或者index文件),没找到就往上级磁盘
6生产依赖与生产依赖
1.生产
npm i -s jquery -s 等效于--save 包信息保存在package.json中的dependencies属性
2.开发
npm i -D less -D代表 --save-Dev 保存在devDependencies
安装之前看文档,看作用需不要在生产用。-s是默认选项
7全局安装
全局安装命令不受工作目录影响
1.自动重启server服务
npm i -g nodemon
直接在终端运行 nodemon http.js如果报脚本错误需要修改windows执行策略,或者
nodemon 在vscode选择Commond Prompt 运行 nodeman http.js
2.npm root -g可以查看全局安装包的位置。只有全局类的工具才适合全局安装
8安装指定版本的包,卸载依赖
npm install jquery@1.11.2
npm remove jquery 等同于 npm r jquery
9.配置别名 package.json中scripts
{
"name": "test",
"version": "1.0.0",
"description": "学习npm",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"server":"node index.js"
},
"author": "wangxiaoyu",
"license": "ISC"
}
// 此时可以通过npm run server快捷运行,在命令参数多的时候很有必要
// npm run 有自动向上级目录查照的特性,跟require函数一样。
10 配置淘宝镜像服务器(nrm)
1.npm i -g nrm
2.nrm use taobao
nrm ls 可以查看镜像服务器
npm ---------- https://registry.npmjs.org/
yarn --------- https://registry.yarnpkg.com/
tencent ------ https://mirrors.cloud.tencent.com/npm/
cnpm --------- https://r.cnpmjs.org/
taobao ------- https://registry.npmmirror.com/
npmMirror ---- https://skimdb.npmjs.com/registry/
配置后可以通过npm config list 查看registy
11 yarn
可以通过yarn init 初始化package.json yarn add jquery yarn add jquery --dev yarn remove jquery
12 npm 发布一个包
1.npm init 初始化package.json
2.main.js文件创建
index.js
function add(){}
module.exports = {add}
3 注册npm账号
npm官网注册, www.npmjs.com/sighup
4.项目终端 npm login
输入用户名 密码 邮箱 和邮箱验证信息登录
5.npm publish 发布
6.如果需要更新包,修改package.json中的版本号,发布
7.npm unpublish --force
项目终端输入 作为删除(必须是包作者,且发布时间小于24小时,大于24小时后没用其他依赖并且每周小于下载量。只有一个维护者 可以删除)
13 npm的nvm,切换node版本
1下载安装 nvm-setup.exe 2.npm list available 查看所有npm版本 3.nvm install 16.18.0 4.nvm use 16.18.0 5.nvm list 查看列表 6.nvm uninstall 16.18.0卸载
5 express框架
1.代码示例
1.express是一个封装好的工具包,封装了http 2.npm init项目初始化,建立server.js文件 npm i express
// 导入
const express = require('express')
// 创建应用对象
const app = express()
// 创建get路由
app.get('/homt',(req,res)=>{
res.end('hello express')
})
app.get('/',(req,res)=>{
res.end('hello')
})
app.get('/:id.html',(req,res)=>{
// http:127.0.0.1:3000/123.html req.params.id拿到查询字符串123
})
app.post('/login',(req,res)=>{
res.end('hello')
})
app.all('/test',(req,res)=>{
// 原生http模块的方法也兼容 比如req.method req.url
// req.path 和req.query req.ip可以直接获取
// req.get('host')获取请求头
// 响应设置
// res.status(500)
// res.set('aaa',bbb)
// res.send('不会乱码',res的方法可以链式调用 res.set().send())
res.end('test 不限制请求方法')
})
app.all('/*',(req,res)=>{
res.end('404 上面匹配不了的到此处,托底的路由规则')
})
app.get('/other',(req,res)=>{
// 跳转响应
res.redirect('http://www.baidu.com')
// 下载响应 此时浏览器请求到当前url会触发下载。
res.download(__dirname + '/pageage.json')
// json响应
res.json({name:'',age:12})
// 响应文件内容
res.sendFile(__dirname + '/test.html')
})
app.listen(3000,()=>{
console.log('服务启动了');
})
node serve.js或者nodemon serve.js启动 输入127.0.0.1:3000/get
2.路由
1.什么是路由
官方定义:路由确定了应用程序如何响应客户端对特定端点的请求
2.路由组成
请求方法,路径,回调函数. app.(path,callbak)
3.express中间件
1.概念
中间件本质是一个回调函数,可以像路由回调一样访问请求对象(resquest)响应对象(response)
2.作用
使用函数封装公共操作,简化代码
3.类型
全局中间件,请求到达后会执行。路由中间件则会到具体的路由执行
// 导入
const express = require('express')
// 创建应用对象
const app = express()
// 全局中间件
function recordMiddleware(req,res,next){
const {url} = req
fs.appendFileSync(path.resolve() + '')
}
//使用
app.use(recordMiddleware)
// 静态资源中间件
app.use(express.static(__dirname + '/public')) 参数即为静态资源文件夹路径
// 创建get路由
//路由中间件
function routeMiddle(req,res,next){
if(res.code == 200) next()
}
app.get('/setting',routeMiddle,(req,res)=>{
res.end('hello express')
})
app.listen(3000,()=>{
console.log('服务启动了');
})