nodejs

281 阅读6分钟

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('服务启动了');
})

4.静态资源中间件