node学习笔记

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上,这样做的目的是为了让开发人员更方便的去下载使用
2.起步 2.1.安装Node环境
  • 查看当前Node环境的版本
  • 下载:https://nodejs.org/en/download/
  • 安装
    – 傻瓜式的一路next
    – 已经安装过的,重新安装就会升级
  • 确认Node环境是否安装成功
    – 打开命令行输入 node --version 或者 node -v
  • 环境变量
2.2.HelloWorld
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
4.5.Content-Type
http://tool.oschina.net/
解析请求路径中的查询字符串 url.parse()
如何在node中实现服务器重定向
在请求头中设置location
状态码 302 临时重定向 301永久重定向
5.Node中的模块系统 使用node编写应用程序主要就是在使用:
  • EcmaScript语言
    和浏览器不一样,node中没有dom、bom
  • 核心模块
    fs、http、path、url、os
  • 第三方模块
    通过npm下载
  • 自己写的模块
  • 加载规则以及加载机制
  • 循环加载
路径形式模块
  • ./当前目录,不可省略
  • . ./父目录,不可省略
5.1.什么是模块化
  • 文件作用域
  • 通信规则
    加载require
    导出exports
5.2.加载规则
核心模块
核心模块文件已经被编译到二进制文件中,只需要按照名字加载就可以
例: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 数据库名 切换到指定数据库
在node中如何操作MongoDB数据库
  1. 使用官方的mongodb包来操作
  2. 使用第三方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
8.1.1代码无分号问题 当一行代码以
  • (
  • [
  • 以上三者开头,最好在其之前补上一个分号
8.2.解决代码写完自动重启服务问题
可以使用第三方命令行工具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')//模块加载的路径中的相对路径不能省略 ./

    推荐阅读