Node.js 笔记(一)

Node.js 笔记(一)

总结(上)

1.1 NodeJs介绍与使用

  • Node.js 是什么
    • JavaScript 运行时
    • 既不是语言,也不是框架,它是一个平台
  • 利用NodeJS打开JS文件
    • 在git bush中定位到JS文件所在的文件夹
    • 输入“node XX.js”即可执行js文件中的代码
    helloworld.js:
    var i = "hello world"
    console.log(i)
    
    在git bush中输入:
    node helloworld.js//"hello world"
    
    • 注意:文件名不要用“node.js”来命名
  • Node.js 中的 JavaScript
    • 没有 BOM、DOM
    • EcmaScript 基本的 JavaScript 语言部分
    • 在 Node 中为 JavaScript 提供了一些服务器级别的API
      • 具有文件操作的能力(下边1.2展开讨论)
      • http 服务的能力(下边1.3展开跳了)

1.2 文件操作

1.2.1 file-system核心模块
  • fs:file-system,在Node中如果想要进行文件操作,就必须引入fs这个核心模块。这个核心模块提供了所有的文件操作相关的 API
  1. 加载fs核心模块
  //使用require加载fs核心模块
    var fs = require('fs')
  1. 读取文件(fs.readFile)
  • fs.readFile(‘文件路径/XX.txt’,回调函数(error,data){ })
  • 两个参数:参数1即文件路径下的某个txt文件,参数2即回调函数传入error和data两个对象参数。
成功:
    data中接收到的是数据
    error中接收到的是null
失败:
    data undefined没有数据
    error 错误对象
//使用require方法加载fs核心模块
var fs = require('fs')

fs.readFile('./data/a.txt', function (error, data) {

// 我们需要通过toString方法
将文件的二进制码转为我们能认识的字符

// 在这里就可以通过判断 error 来确认是否有错误发生

    if (error) {
      console.log('读取文件失败了')
    } else {
      console.log(data.toString())
    }
  })
  1. 写文件(fs.writeFile)
  • fs.writeFile(‘文件路径/XX文件’,‘写入内容’,回调函数(error,data){ })
成功:
    文件写入成功
    error 是 null
失败:
    文件写入失败
    error 就是错误对象
fs.writeFile('./data/你好.md', '大家好,给大家介绍一下,我是Node.js', function (error) {
      if (error) {
        console.log('写入失败')
      } else {
        console.log('写入成功了')
      }
    })

1.3 http核心模块

  • 最简单的接收请求:
  1. 同样是用require方法加载核心模块http
var http = require('http')
  1. createServer()方法可以创建一个Web服务器,返回一个Server实例
var server = http.createServer()
  1. 让服务器执行一系列指令,server.on()接受两个参数:参数一请求对象request,参数二回调函数。
- 提供服务:对 数据的服务
- 发请求
- 接收请求
- 处理请求
- 给个反馈(发送响应)
- 注册 request 请求事件
- 当客户端请求过来,就会自动触发服务器的request 请求事件,然后执行第二个参数:回调处理函数
server.on('request', function () {
  console.log('收到客户端的请求了')
})
  1. 绑定端口号,启动服务器server.listen()
server.listen(3000, function () {
  console.log('服务器启动成功了,可以通过 http://127.0.0.1:3000/ 来进行访问')
})
  • 发送响应
  1. http实例server的on()方法,设置处理request事件的回调函数,该函数要传入require和response两个对象参数。
  2. 使用request.url可以获得用户请求的路径(即www.baidu.com/获取这部分内容)。response对象有一个方法write(),用于给客户端发送相应数据。
    • 注:可以多次使用write,但最后必须用end来结束响应,否则客户端会一直响应。
  3. 这个例子无论访问哪个路径皆接收到helloworld
var http = require('http')
var server = http.createServer()

server.on('request',function(require,response){
    console.log('收到客户端请求,请求路径是:' + request.url)
    response.write('hello')
    response.write('world')
    response.end()
})

server.listen(3000,function(){
    console.log('服务器启动成功了,可以通过http://127.0.0.1:3000/来访问')
})
  • 根据不同请求路径返回不同数据: 要使用JSON.stringify()序列化才能传输(因为只认字符串和二进制码)
var http = require('http')

var server = http.createServer()

serve.on('request',function(req,res){
    console.log('收到请求了,请求路径是' + req.url)
    
    switch(request.url){
    case '/index':
    response.write('hello')
    response.write('nodejs')
    response.end()
    break
    case '/login':
    var products = [{
        name: '苹果 X',
        price: 8888
      },
      {
        name: '菠萝 X',
        price: 5000
      },
      {
        name: '小辣椒 X',
        price: 1999
      }
    ]
    下一行代码是关键,序列化让网页能获取到这个数组
    response.end(JSON.stringify(products))
    break
    default: 
    response.end('404 Not Found')
})

server.listen(3000,function(){
    console.log('服务器启动成功,可以访问http://127.0.0.1:3000/')
})

res.end('hello world')
  • 无论是write还是end,响应的只能是字符串,或二进制数。传入数值、中文什么都不行。JSON.stringify()即可。
    response.write('hello')
    response.write('world')
    response.end()
    可以替换成下边一行代码:
    res.end('hello world')

1.4 Node中的模块

三种模块:

- 具名模块:例如fs、http;
- 用户自己编写的文件(js文件)模块;
  require('./b.js')使用相对路径加载自定义模块
- 第三方模块
  • 自定义的模块,require()是有返回值的,返回的是一个对象,该对象的属性和方法皆需要在请求的文件中使用exports.属性或方法来定义,默认是一个空对象
a.js:
var bExports = require('./b')//默认bExports={}
//通过返回的对象bExport来使用它的属性和方法。
console.log(bExports.foo)//hello
console.log(bExports.add(10,10))//20

b.js:
var foo = 'bbb'
//利用exports.属性或方法来定义输出对象
exports.foo = 'hello'//{foo:'hello'}
exports.add = function(x,y){
    return x+y
}
  • 自我理解:require不管请求具名核心模块(fs、http)还是使用自定义文件(js文件)模块,都是通过require()来实例化,获取该具名模块或该文件模块的属性和方法
  • 模块执行碰到require()就会执行对应的js文件,执行完后再跳回来。
a.js:
console.log('开始执行a')
require('./b.js')
console.log('结束执行a')

b.js:
console.log('开始执行b')
console.log('结束执行b')

打印结果:
    开始执行a
    开始执行b
    结束执行b
    结束执行a
  • 模块是有模块作用域的,a.js用require执行b.js,在b.js中是用不了a.js定义的函数和变量。简单理解,超出文件外的函数和变量是不能调用的。
  • require(’./b.js’)中‘./’是不能省略的,但b的后缀名是可以省略的。

1.5 常用核心模块

  • fs、http、path、os(系统信息)
  • 加载具名核心模块用require()

总结(下)

2.1 http的一些内容

  • require请求
  • IP和端口号(80等等)
    • ip 地址定位计算机
    • 端口号定位具体的应用程序
    • 过程:先输入网址,DNS解析为服务器的IP地址定位电脑(服务器),根据请求中的**端口号(浏览器自动处理)**确定服务器需要使用哪个具体的应用程序处理请求。

2.2 Content-Type(响应内容类型)

  • 服务器响应的数据内容类型告诉客户端,而且要正确的告诉。否则它会按操作系统默认的去解析。
  • 不同的资源对应的 Content-Type 是不一样,具体参照:http://tool.oschina.net/commons
  • 对于文本类型的数据,最好都加上编码,目的是为了防止中文解析乱码问题
  • 以上问题要使用setHeader()方法,参数1设置头部中的Content-type,参数2,文本类型,例如:‘text/html; charset=utf-8’。
var http = require('http')
var server = http.createServer()
server.on('request', function (req, res) {

  var url = req.url

  if (url === '/plain') {
    // text/plain 就是普通文本
    res.setHeader('Content-Type', 'text/plain; charset=utf-8')
    res.end('hello 世界')
  } else if (url === '/html') {
    // 如果你发送的是 html 格式的字符串,则也要告诉浏览器我给你发送是 text/html 格式的内容
    res.setHeader('Content-Type', 'text/html; charset=utf-8')
    res.end('<p>hello html <a href="">点我</a></p>')
  }
})

server.listen(3000, function () {
  console.log('Server is running...')
})  
  • 通过网络发送文件
    • 发送的并不是文件,本质上来讲发送是文件的内容
    • 浏览器收到服务器响应内容之后,就会根据 Content-Type 进行对应的解析处理

2.3 使用http发送本地资源文件夹

  • 可发送CSS、JS、HTML、图片等等文件。
var fs = require('fs')
var http = require('http')
var server = http.createServer()

server.on('request',function(req,res){
    //请求地址
    var url = req.url
    //根据请求地址,发送对应内容
    if(url == '/'){
    //访问首页读取文件
        fs.readFile('./resource/index.html',function(err,data){
            if(error){
                //每次都要告诉浏览器发送的数据内容类型
                res.setHeader('Content-Type', 'text/plain; charset=utf-8')
                console.log('读取失败')
            }else {
                //此处要改为text/html,因为发送的是一个html文件
                res.setHeader('Content-Type', 'text/html; charset=utf-8')
                res.end(data)//其他类型值需要toString或JSON.stringify()
            }
        })
    }else if(url == '/baby'){
        //访问特定的页面
        fs.readFile('./resource/ab2.jpg', function (err, data) {
            if (err) {
            res.setHeader('Content-Type', 'text/plain; charset=utf-8')
            res.end('文件读取失败,请稍后重试!')
          } else {
          //传图片的时候,注意不要放入charset
            res.setHeader('Content-Type', 'image/jpeg')
            res.end(data)
            }
        })
    }else{
        res.setHeader('Content-Type', 'text/plain; charset=utf-8')
        console.log('访问失败')
    }
})
server.listen(3000,function(){
    console('Server is running...')
}

2.4 Node 中的 JavaScript

  • EcmaScript
    • 变量
    • 方法
    • 数据类型
    • 内置对象
    • Array
    • Object
    • Date
    • Math

2.5 模块系统

    - 在 Node 中没有全局作用域的概念
    - 在 Node 中,只能通过 require 方法来加载执行多个 JavaScript 脚本文件
    - require 加载只能是执行其中的代码,文件与文件之间由于是模块作用域,所以不会有污染的问题
      - 模块完全是封闭的
      - 外部无法访问内部
      - 内部也无法访问外部
    - 模块作用域固然带来了一些好处,可以加载执行多个文件,可以完全避免变量命名冲突污染的问题
    - 但是某些情况下,模块与模块是需要进行通信的
    - 在每个模块中,都提供了一个对象:`exports`
    - 该对象默认是一个空对象
    - 你要做的就是把需要被外部访问使用的成员手动的挂载到 `exports` 接口对象中
    - 然后谁来 `require` 这个模块,谁就可以得到模块内部的 `exports` 接口对象
    - 还有其它的一些规则,具体后面讲,以及如何在项目中去使用这种编程方式,会通过后面的案例来处理
  • 核心模块
    • 核心模块是由 Node 提供的一个个的具名的模块,它们都有自己特殊的名称标识,例如
      • fs 文件操作模块
      • http 网络服务构建模块
      • os 操作系统信息模块
      • path 路径处理模块
      • 。。。。
    • 所有核心模块在使用的时候都必须手动的先使用 require 方法来加载,然后才可以使用,例如:
      • var fs = require('fs')
  • 模块系统
  • Node 中的其它的核心模块
  • 做一个小管理系统:
    • CRUD
  • Express Web 开发框架
    • npm install express
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值