Node
1.Node.js介绍 node.js是一个javascript运行时环境,可以解析和执行javascript代码,不是一门语言,不是库,不是框架。
node.js中的javascript
- 没有BOM、DOM
- EcmaScript
- 在node这个运行时执行环境中为javascript提供了一些服务i器级别的操作ApI,例如文件读写、网络服务的构建、网络通信、http服务器等处理
- 构建于google的v8引擎上
- event-driven 事件驱动
- non-blocking I/O model 非阻塞IO模型(异步)
- 轻量、高效
- npm世界上最大的开源库生态系统,绝大多数javascript相关的包都存放在npm上,这样做的目的是为了让开发人员更方便的去下载使用
- 查看当前Node环境的版本
- 下载:https://nodejs.org/en/download/
- 安装
– 傻瓜式的一路next
– 已经安装过的,重新安装就会升级 - 确认Node环境是否安装成功
– 打开命令行输入 node --version 或者 node -v - 环境变量
1.创建编写javascript脚本文件
2.打开终端,定位到脚本文件所属目录
3.输入 node 文件名 执行对应的文件
- 解释执行javascript
- 读写文件
- http
// 1.加载http核心模块
const http= require('http')
// 文件模块
const fs = require('fs')// 2.使用http.createServer()方法,创建一个web服务器
// 返回一个Server实例
const server = http.createServer()// 接收请求 处理请求 发请求 发送响应
server.on('request', function(req, res) {
//设置 响应头Content-Type
res.setHeader('Content-Type','text/html;
charset=utf-8')
// 读文件
fs.readFile('./hello.html', function(err,data) {
if(err) {
// 发送响应数据,同时结束响应
res.end('获取资源失败')
}else {
res.end(data)
}
})
})// 绑定端口,开启服务器
server.listen(3000, function() {
console.log('服务器已开启,可通过127.0.0.1:3000访问!')
})
3.Node中的javascript 3.1.EcmaScript
3.2.核心模块
Node为javascript提供了许多服务器级别的api。这些api都被包装到一个具名的核心模块中。
例如文件操作的fs模块、http服务构建的http模块,路径模块path、操作系统信息模块os。。。
需要使用核心模块,必须先使用require方法加载
const fs = require('fs')
const http = require('http')
4.Web服务器开发 4.1.ip地址和端口号
- ip地址用来定位计算机
- 端口号用来定位具体的应用程序
- 一切需要互联网通信的软件都会占用一个端口号
- 在计算机中有一些默认端口号,最好不要去使用 例如http服务的80,mysql数据库的3306
http://tool.oschina.net/
解析请求路径中的查询字符串 url.parse()
如何在node中实现服务器重定向
在请求头中设置location
状态码 302 临时重定向 301永久重定向
5.Node中的模块系统 使用node编写应用程序主要就是在使用:
- EcmaScript语言
和浏览器不一样,node中没有dom、bom - 核心模块
fs、http、path、url、os - 第三方模块
通过npm下载 - 自己写的模块
- 加载规则以及加载机制
- 循环加载
- ./当前目录,不可省略
- . ./父目录,不可省略
- 文件作用域
- 通信规则
加载require
导出exports
核心模块
核心模块文件已经被编译到二进制文件中,只需要按照名字加载就可以
例:require(‘http’)
第三方模块
凡是第三方模块都必须通过npm下载
使用的时候,就可以通过require(‘包名’)形式加载使用
既不是核心模块又不是路径形式的模块
先找到当前文件所处目录中的node_modules目录
node_modules/art-template
node_modules/art-template/package,json文件
node_modules/art-template/package,json文件的main属性
main属性就记录了art-template的入口模块
然后加载使用这个第三方包
如果package.json不存在或main指定的入口模块也没有
则node自动去找该目录下的 index.js 如果以上任何一个条件都不成立,则会进入上一级目录的node_modules目录查找
如果上一级还没有,继续往上一级查找
如果知道当前磁盘根目录还找不到,就报错:can not find module xxx
5.3.npm
node package manager
5.3.1.npm常用命令 npm --version
npm install --global npm
npm init -y 跳过向导 初始化
npm install 包名
npm i 包名
只下载
npm install --save 包名
npm i -s
下载并保存依赖项
npm uninstall 包名
只删除
npm un 包名
npm uninstall --save 包名
删除的同时也会把依赖信息去掉
npm un -s 包名
npm 命令 --help
查看指定命令的使用帮助
5.3.2.解决npm被墙问题 npm存储包文件的服务器在国外,有时候会被墙,速度很慢,需要解决这个问题
淘宝开发团队把npm在国内作了备份
安装淘宝的cnpm
npm install --global cnpm (–global 表示安装到全局)
接下来就使用cnpm安装包
例:cnpm install jquery
5.4.package.json
建议每一个项目都有一个package.json文件(包描述文件。就像产品的说明书)
这个文件可通过 npm init 的方式自动初始化出来
建议执行npm install 包名的时候都加上–save,来保存依赖项
即使node_modules删除了也不用担心,只需要,npm install 就会自动把package.json中的dependencies中所有的依赖都下载回来
6.Express 原生的http在某些方面表现不足以应对我们的开发需求,而使用框架可提高我们的开发效率。这里学习以express为主。
6.1.起步
安装:
npm install --saveexpress
案例:
// express框架
const express = require('express')
// 创建服务器
const app = express()
// 路径模块
const path = require('path')
// body-parser模块
const bodyParser =require('body-parser')
// 路由
const router = require('./routes/router.js')
// session
const session = require('express-session')// 开放静态资源
app.use('/public', express.static(path.join(__dirname, 'public')))
app.use('/node_modules', express.static(path.join(__dirname, 'node_modules')))// 配置模板引擎
app.engine('html', require('express-art-template'))// 配置body-parser
app.use(bodyParser.urlencoded( {extended: false}))
app.use(bodyParser.json())// 挂载session
app.use(session({
secret: 'keyboard cat',
resave: false,
saveUninitialized: true
}))// 挂载路由
app.use(router)// 绑定端口,开启服务器
app.listen(3000, () => {
console.log('Server is running!')
})
6.2.在Express中配置使用art-template模板引擎
安装
npm install art-template
npm install express-art-template
配置
app.engine('art', require('express-art-template'))
使用
app.get('/', function (req, res) {
// express默认回去项目中的views目录中查找index.html
res.render('index.html', {
title: 'hello world'
})
})
修改默认的views视图渲染存储目录
app.set(‘views’, 目录路径)
7.MongoDB 安装
启动
# 默认使用执行mongod命令所处盘符根目录下的/data/db 作为自己的数据存储目录
# 所以在第一次执行命令之前,自己手动新建一个 /data/db
mongod
如果想修改默认的数据存储目录,可以
mongod --dbpath=数据存储目录路径
停止
ctrl+c 或直接关闭开启服务的控制台
连接
mongo
退出
exit
基本命令
- show dbs 查看显示所有数据库
- db 查看当前操作的数据库
- use 数据库名 切换到指定数据库
- 使用官方的mongodb包来操作
- 使用第三方mongoose来操作MongoDB数据库
mongoose安装 npm i mongoose
// mongoose框架
const mongoose = require('mongoose')
// 连接数据库
mongoose.connect('mongodb://localhost/admin', { useNewUrlParser: true, useUnifiedTopology: true})const Schema = mongoose.Schemaconst userSchema = new Schema({
email: {
type: String,
required: true
},
uname: {
type: String,
required: true
},
password: {
type: String,
required: true
},
create_time: {
type: Date,
default: Date.now
},
last_modified_time: {
type: Date,
default: Date.now
},
avatar: {
type: String,
default: '/public/images/avatar-default.png'
},
bio: {
type: String,
default: ''
},
gender: {
type: Number,
enum: [-1, 0, 1],
default: 1
},
birthday: {
type: Date
},
status: {
type: Number,
// 0 没有限制
// 1 不能评论
// 2 不能登录
enum: [0, 1, 2],
default: 0
}
})const User = mongoose.model('User', userSchema)module.exports = User
8.其它 8.1.代码风格
- Airbnb JavaScript Style
- JavaScript Standard Style
- (
- [
- ’
- 以上三者开头,最好在其之前补上一个分号
可以使用第三方命令行工具nodemon,来解决修改代码频繁启动服务器问题。
安装: npm install --global nodemon --global安装的包都可以在任意目录执行
安装完成之后,使用:nodemon app.js 来启动服务,它会自动监视你的文件变化,当文件发生变化时,自动帮你重新启动服务器。
8.3.文件操作路径和模块路径
文件操作路径
// 在文件操作的相对路径中
// ./data/a.txt 相对于当前目录
// data/a.txt 相对于当前目录
// /data/a.txt 绝对路径,当前文件模块所处磁盘根目录
// c:/xx/xx 绝对路径
fs.readFile('./data/a.txt', function (err, data) {
if (err) {
// ...
}
// ...
})
【node学习笔记】模块操作路径
//磁盘根目录
require('/data/foo.js')//相对路径
require('./data/foo.js')//模块加载的路径中的相对路径不能省略 ./