简单了解node
node的设计模式
- node 由 V8 引擎封装的
- node 使 javascrip t可以运行在浏览器之外
- node 没有document 对象,没有bom dom window 等对象
- 报错 document is not defined
node的工作方式
- 异步 一个进程可以服务多个请求
安装node
- node -v 查看node的是否安装
- 一般安装稳定版本
- 一直点击下一步完成
第一个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"三个数字部分含义:
主要版本号
- 破坏了现有应用与mongoose的依赖关系就增加版本号
- 次要和补丁清0
- 5.0.0
次要版本号
添加的新特性
补丁号清零
^4.14.0
补丁号(补丁更新)
- 如果修复了一个bug,补丁号就会增加一个数 ^4.13.6
- 补丁号时0是还不够稳定
插入符号和波浪线
- 保持应用最新
查看已安装的包
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
发布一个包
- 创建一个库
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被占用解决方法
- 找到自己的端口号:
netstat -ano|findstr "3000"- 我的电脑上为3000端口

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

环境变量
3000端口是写死的,在开发环境中可行,但在生产环境中,发布在共享平台,端口号是平台动态分配的,3000端口不一定可用
环境变量中管理端口属性是PORT
环境变量就是在进程中运行的时候才产生的变量,它是应用之外设置的变量
使用process对象读取 env属性是环境变量的缩写 所需的环境变量 PORT
const port = process.env.PORT || 300 //如果PORT设置了我们就用它,否则就用3000const 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的//没有写上