node知识总结

简单了解node

node的设计模式

  1. node 由 V8 引擎封装的
  2. node 使 javascrip t可以运行在浏览器之外
  3. node 没有document 对象,没有bom dom window 等对象
    • 报错 document is not defined

node的工作方式

  • 异步 一个进程可以服务多个请求

安装node

  1. node -v 查看node的是否安装
  2. 一般安装稳定版本
  3. 一直点击下一步完成

第一个node程序

  • 运行node 在终端上,或者命令运行
  • 运行方式:
    • 在文件自身的位置上运行 可以在本地地址栏输入cmd
    • 在命令行里打开文件 使用cd命令切换
    • 运行是node 空格加 js文件
    node node文件.js
    

全局对象

  • node 没有 window 对象
  • node的全局对象是global

node的模块

  • 每一个文件就是一个模块
  • 模块内的作用域和函数模块外不可访问
  • 如果需要使用其他模块的内容需要导出

创建模块,导出模块

  • module对象的exports属性
  var url = 'http://myweb.com';
  function log(message) {
     consloe.log(message);
   }
   //导出对象
   module.exports.url = url
   module.exports.log = log 

加载模块

  • 使用 require 加载模块
    • const logger = require(‘./logger.js’)
    • logger.log(‘message’)
    • 看清楚文件位置
    • 可以不加扩展名 node 会自动添加
  • 一般定义为常量 避免重新赋值
  • 可以导出一个对象或者函数
    • module.exports = log 直接赋值
    • 直接调用函数 log(‘meaasge’)

模块包裹函数

  • node总是将自己包裹在一个函数里
  (function(exports,require,module,__filename,__dirname) {
    内容
})

注意点:

简写module.exports 为 exports 引用
简写之后就不能重置exports对象了,即使不能给exports对象赋值

路径模块

  • 导入内置模块
const path =  require('path')

操作系统模块

  • 导入模块
const os = require('os')

文件系统模块

const fs = require('fs')

events事件模块

node事件

EventEmitter是一个类 每个单词开头都要大写

const EventEmitter = require ('events')

创建一个对象

const emitter = new EventEmitter()

注册一个监听器 事件发生时被调用的函数

on 和 addListener 方法 on更加常用

on需要两个参数

1. 第一个是事件的名称
1. 第二个是回调函数 ,也就是实时的监听者
emitter.on('messageLogged',function() {
console.log('Listener called')
})

emit()方法是用来发起事件的

emitter.emit('messageLogged')

事件参数

​ 传递事件发生时的数据

emitter.on('messageLogged',(arg) =>{
console.log('Listener called',arg)
})

arg约定俗成 e或者eventArg

emitter.emit('messageLogged',{id:1,url:'http://'})

监听者可以得到事件的参数

class

如果你想要使用监听器来监测某个事件的发生,需要创建一个扩展来自EventEmitter的类,这个类就具有了EventEmitter的所有功能

http模块

const http = require('http')
const server = http.createServer()
server.on('connection',(socket)=> {
   consolr.log('New Connection')
})
server.listen(3000);
console.log('Listening on port 3000....')
const http = require('http')
const server = http.createServer((req,res) =>{
     if(req.url === '/') {
         res.write('Hello');
         res.end();
     }
     if(req.url === '/api/courses') {
         res.write(JSON.stringify([1,2,3]))
         res.end()
     }
});

server.listen(3000);
console.log('Listening on port 3000....');

npm 第三方包的管理

安装npm

npm i -g npm@5.5.1

g是全局 @后面是版本

如果权限报错,需要再用户管理的地方添加模块

package.json文件

创建json文件

npm init

默认回复yes

npm int --yes

安装一个包

npm i underscorejs

上传git

  • node的源码上传git时,需要建立一个没有文件名的文件
  • . gitignore
    1. 文件里写上要去除的文件夹
    1. node_modules/

语义版本控制

  • node包的版本号

    "mongoose":"^4.13.6"
    

    三个数字部分含义:

    1. 主要版本号

      • 破坏了现有应用与mongoose的依赖关系就增加版本号
      • 次要和补丁清0
      • 5.0.0
    2. 次要版本号

      • 添加的新特性

      • 补丁号清零

      • ^4.14.0

    3. 补丁号(补丁更新)

      • 如果修复了一个bug,补丁号就会增加一个数 ^4.13.6
      • 补丁号时0是还不够稳定
    4. 插入符号和波浪线

      • 保持应用最新

查看已安装的包

npm list

只看自己应用的依赖包就设置深度参数 --depth=0, 不过现在已经不需要了

npm list --depth=0

查看包的注册信息

  • 查看package.json文件的内容
npm view mongoose 
  • 只关心依赖的信息
npm view mongoose dependencies
  • 查看迄今为止发布的所有版本号
npm view mongoose versions

安装特定版本的包

  • @后面是特定的版本号
npm  i mongoose@2.4.2

升级包

  • 查看已安装版本及对比在npm注册库中发布的版本
npm outdated
  • 升级 指挥升级次要版本和补丁号
npm update
  • 最新发布的版本
npm i -g npm-check-updates
  • 查看已安装的包和可安装的包
 npm-check-updates
  • Run ncu -u to upgrade package.json

    简写为ncu 并且加上-u 来更新package.json

    没有更新依赖

  • 安装依赖

npm i

开发依赖库

  • 找出语法错误
npm i jshint --save-dev

​ --save-dev 说明是开发

删除包

npm uninstall xxx  //简写npm un xxx

操作全局包

  • 安装全局的工作包
npm i -g npm 

发布一个包

  1. 创建一个库
mkdir lion-lib
cd lion-lib
npm init --yes
在vscode创建一个文件,编写一点东西
创建npm账号  npm adduser
已有帐号 npm login
运行npm pushlish
在lion-lib的package.json修改唯一的名字
再运行npm pushlish
就开始下载使用这个包了

更新包

  • 手动更新版本号
  • 借助npm
npm version patch/minor
  • 再次运行npm publish

express

  • 安装express
npm i -g express

创建第一个web服务器

const express = require('express')
const app = express()

app.get('/',(req,res)=> {
    res.send('你好')
});
app.get('/api/course',(req,res)=> {
     res.send([1,2,3,5])
})
app.listen(3000,()=> console.log('Listen to 3000'))

自动启动应用nodemon

  • nodeMon node monitor的简写
  • 全局使用 npm i -g
npm i -g nodemon
  • 使用 nodemon index.js

​ 会监测该文件夹所有的文件改动,任何文件名和扩展名

注意点

​ 使用nodemon时命令行报错:listen EADDRINUSE: address already in use :::3000

​ 端口号3000被占用解决方法

  1. 找到自己的端口号:netstat -ano|findstr "3000"
    • 我的电脑上为3000端口

在这里插入图片描述

  1. 强制关闭进程:taskkill -PID 16556 -f
    • 16556是我电脑上的,要根据自己电脑上的PID修改

在这里插入图片描述

环境变量

  • 3000端口是写死的,在开发环境中可行,但在生产环境中,发布在共享平台,端口号是平台动态分配的,3000端口不一定可用

  • 环境变量中管理端口属性是PORT

  • 环境变量就是在进程中运行的时候才产生的变量,它是应用之外设置的变量

  • 使用process对象读取 env属性是环境变量的缩写 所需的环境变量 PORT

    const port = process.env.PORT || 300
    //如果PORT设置了我们就用它,否则就用3000
    
    const express = require('express')
    const app = express()
    
    app.get('/',(req,res)=> {
        res.send('你好,我的世界!')
    });
    app.get('/api/course',(req,res)=> {
         res.send([1,2,3,5])
    })
    const port = process.env.PORT || 300
    //如果PORT设置了我们就用它,否则就用3000
    app.listen(port,()=> console.log(`Listen to ${port}`))
    

    如果端口号还是3000,因为你的电脑没有设置PORT环境变量

    • 设置环境变量 在命令行中
    export PORT = 5000
    

路由参数

const express = require('express')
const app = express()

app.get('/',(req,res)=> {
    res.send('你好,我的世界!')
});
app.get('/api/course',(req,res)=> {
     res.send([1,2,3,5])
})
// 定义一个参数:id  id参数名
app.get('/api/course/:id',(req,res)=> {
    // 读取这个参数使用params
    res.send(req.params.id)  //发送给客户端
})
const port = process.env.PORT || 300
//如果PORT设置了我们就用它,否则就用3000
app.listen(port,()=> console.log(`Listen to ${port}`))

处理get请求

使用get请求根据id查询是否有对应的课程

const express = require('express')
const app = express()

const courses = [
    {id:1,name:'one'},
    {id:2,name:'two'},
    {id:3,name:'three'},

];
app.get('/',(req,res)=> {
    res.send('你好,我的世界!')
});
app.get('/api/courses',(req,res)=> {
     res.send(courses)
})
// 定义一个参数:id  id参数名
app.get('/api/courses/:id',(req,res)=> {
   // 数组find方法查找
   const course = courses.find(c => c.id === parseInt(req.params.id)) //id返回的是字符串 转为整型量
     //如果没有找到就返回404,客户端请求的资源没有
   if(!course) res.status(404).send('给定id的课程不存在')
    //有找到就发送到客户端
   res.send(course)
})
const port = process.env.PORT || 300
//如果PORT设置了我们就用它,否则就用3000
app.listen(port,()=> console.log(`Listen to ${port}`))

处理post请求

使用post请求创建新的课程

const express = require('express')
const app = express()
app.use(express.json())

const courses = [
    {id:1,name:'one'},
    {id:2,name:'two'},
    {id:3,name:'three'},

];
app.get('/',(req,res)=> {
    res.send('你好,我的世界!')
});
app.get('/api/courses',(req,res)=> {
     res.send(courses)
})

app.post('/api/courses',(req,res) => {
    // 需要读取request的请求体以获得课程对象
    // 创建一个新的对象 ,再把对象添加到数组
    const course = {
        id: courses.length + 1,
        name: req.body.name   //需要打开Express获取请求体中JSON对象的功能  默认是关闭的
    }
    courses.push(course) //添加到数组中
    res.send(course) //客户端可能需要用到新资源的id
})
/// 定义一个参数:id  id参数名
app.get('/api/courses/:id',(req,res)=> {
   // 数组find方法查找
   const course = courses.find(c => c.id === parseInt(req.params.id)) //id返回的是字符串 转为整型量
     //如果没有找到就返回404,客户端请求的资源没有
   if(!course) res.status(404).send('给定id的课程不存在')
    //有找到就发送到客户端
   res.send(course)
})

const port = process.env.PORT || 300
//如果PORT设置了我们就用它,否则就用3000
app.listen(port,()=> console.log(`Listen to ${port}`))
  • 报错:Error while sending request: Failed to execute ‘open’ on ‘XMLHttpRequest’: >
    Invalid URL

  • 原因是url的//没有写上


版权声明:本文为weixin_50939386原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。