内容

  • Node.js介绍

    • 是什么
    • 特性
    • 模块化
  • 能做什么
  • Node.js的一些学习资源
  • 读取文件 - fs
  • 构建web服务器 - http

一、Node.js介绍

1、Node.js是什么

image.png

  • Node.js是一个可以解析和执行JavaScript代码的JavaScript运行时环境

    • Node.js不是一门语言
    • 不是库,不是框架,是一个平台
    • Node.js是一个JavaScript运行时环境
    • 简单来说就是Node.js可以解析和执行JavaScript代码
    • 也就是说现在的JavaScript可以完全脱离浏览器运行,一切归功于Node.js
  • 构建于chrome V8之上

    • 代码只是特性的字符串
    • 引擎可以认识它,并解析和执行
    • Google Chrome v8引擎是目前公认的解析和执行JavaScript最快的的引擎
    • Node.js的作者把Google Chrome 的v8引擎移植出来,开发了一个独立的JavaScript运行时环境
  • 浏览器中的JavaScript

    • ECMAScript
    • DOM
    • BOM
  • Node.js中的JavaScript

    • ECMAScript
    • 没有DOM,BOM---服务端不操作DOM和BOM
    • Node.js为JavaScript提供了一些服务器级别操作的API

      • 文件的读写
      • 网络服务的构建
      • 网络通信
      • http服务器等处理
    • 这些API核心模块是由 Node 提供的一个个的具名的模块,它们都有自己特殊的名称标识
    • 我们通过require引入
    var fs=require('fs')
  • Node.js的特性

    • 事件驱动
    • 非阻塞IO模型(异步)
    • 轻量和高效
  • Node.js包生态系统-npm--世界上最大的开源库

    • 绝大多数的JavaScript相关的包都保存在了npm上,这样让开发人员更方便的下载使用
  • Node模块化

    • 模块有三种

      • 具名模块:fs,http
      • 用户自己编写的模块

        • 使用 exports 导出,使用 require 导入
        • Node没有全局作用域,只有模块作用域,外部访问不到内部,内部也访问不到外部
        • 相对路径用"./"
        • 可以省略后缀名

2、Node.js能做什么

  • WEB服务器后台
  • 命令行工具

    • git(C语言)
    • npm(node开发的)
    • hexo(node)

3、一些资源

4、能学到什么

  • B/S编程模型

    • Brower-Server
    • back-end
    • 服务器端语言都是B/S模型
  • 模块化编程

    • RequireJS
    • SeaJS
    • 以前认识的JavaScript只能通过<script>标签来加载
    • 在node中可以像@import一样引入加载JavaScript脚本文件
  • Node常用API
  • 异步编程

    • 回调函数
    • Promise
    • async
    • generator
  • Express第三方开发框架
  • ES6

二、Hello World

  1. 创建编写JavaScript脚本文件
  2. 终端定位到对应目录
  3. node 文件名 执行对应的文件

注意:

  • 文件不能使用node.js命名
  • 尽量不使用中文命名
  • Node中采用ECMAScript进行编码,没有DOM和BOM

三、文件的读写

fs: file system 文件系统。node的fs模块中包含所有文件操作相关的API

  1. 使用require方法加载 fs 核心模块
    var fs=require('fs')
  1. 读文件

    • 第一个参数就是要读取的文件路径
    • 第二个参数是一个回调函数
    • 成功

      • data 数据
      • error null
    • 失败

      • data undefined没有数据
      • error 错误对象
fs.readFlie("要读取文件的路径",(err,data)=>{
     if (error) {
        console.log('读取文件失败了')
     } else {
        console.log(data.toString())
     }
})
  1. 写文件

    • 第一个参数:文件路径
    • 第二个参数:文件内容
    • 第三个参数:回调函数

      • 回调函数有参数:error
    • 成功:

      • 文件写入成功
      • error 是 null
    • 失败:

      • 文件写入失败
      • error 就是错误对象
fs.writeFile('./data/你好.md', '大家好,给大家介绍一下,我是Node.js', function (error) {
    if (error) {
         console.log('写入失败')
     } else {
        console.log('写入成功了')
    }
})

四 构建web服务器

4.1关于ip地址和端口号

  • ip地址用来定位计算机
  • 端口号用来定位具体的应用程序
  • 一切需要联网通信的软件都会占用一个端口号
  • 端口号范围 0-65536
  • 最好不要去使用计算机的一些默认端口,例如http服务的80端口

4.2 http模块:创建编写服务器

1.加载http核心模块

    var http = require('http');

2.使用http.createServer创建一个服务器实例

    var server = http.createServer()

3.绑定端口号,启动服务器

   server.listen(3000, function() {
       console.log('服务器启动成功了,可以通过 http://127.0.0.1:3000/ 来进行访问')
   })
- 执行此文件,就会打印'服务器启动成功了,可以通过 http://127.0.0.1:3000/ 来进行访问'
- 浏览器访问http://127.0.0.1:3000/会打印'收到客户端的请求了''

4.服务器要干嘛?接受请求,发送响应数据

  • 客户端访问服务器地址,发送访问请求
  • 服务器端 注册 request 请求事件,接收请求,
  • 执行第二个参数:回调处理函数(请求事件处理函数),并处理请求,发送响应

    • request 请求事件处理函数,需要接收两个参数:
    • Request 请求对象 : 可以用来获取客户端的一些请求信息,例如请求路径

      • 例如:request.url : 请求路径
    • Response 响应对象 : 可以用来给客户端发送响应消息

      • response对象有一个方法:response.write(),可以用来给客户端发送响应数据
      • write 可以使用多次,但是最后一定要使用 end方法来结束响应,否则客户端会一直等待
      • 一般情况下,我们直接使用response.end("响应数据")
  • 用例
server.on('request', function (request, response) {

  console.log('收到客户端的请求了,请求路径是:' + request.url)

  // response 对象有一个方法:write 可以用来给客户端发送响应数据
  // write 可以使用多次,但是最后一定要使用 end 来结束响应,否则客户端会一直等待
  response.write('hello')
  response.write(' nodejs')
  // 告诉客户端,我的话说完了,你可以呈递给用户了
  response.end()
})

根据不同的url响应不同的内容

var http = require('http')

// 1. 创建 Server
var server = http.createServer()

// 2. 监听 request 请求事件,设置请求处理函数
server.on('request', function (req, res) {

  var url = req.url

  if (url === '/') {
    res.end('index page')
  } else if (url === '/login') {
    res.end('login page')
  } else if (url === '/products') {
    var products = [{
        name: '苹果 X',
        price: 8888
      },
      {
        name: '菠萝 X',
        price: 5000
      },
      {
        name: '小辣椒 X',
        price: 1999
      }
    ]

    // 响应内容只能是二进制数据或者字符串
    //  数字
    //  对象
    //  数组
    //  布尔值
    res.end(JSON.stringify(products))
  } else {
    res.end('404 Not Found.')
  }
})

// 3. 绑定端口号,启动服务
server.listen(3000, function () {
  console.log('服务器启动成功,可以访问了。。。')
})

4.3. content-type---浏览器响应内容类型及编码

  • 不同的类型对应不同的content-type
  • 查找工具: http://tool.oschina.net/commons
  • 图片不需要指定编码格式,一般为字符串指定编码格式

        res.setHeader('Content-Type', 'text/plain; charset=utf-8')
        res.setHeader('Content-Type', 'text/html; charset=utf-8')
        res.setHeader('Content-Type', 'image/jpeg')
    - 服务器默认发送数据的格式是utf-8模式
    - 浏览器默认操作系统的编码:中文编码:gbk
    - 在 http 协议中,Content-T就是用来告知对方我给你发送的数据内容是什么类型
    - text/plain 普通文本,如果是html格式的,用text/html

4.4. fs 模块和http模块组合使用读取不同的内容

var http = require('http')
var fs = require('fs')

var server = http.createServer()

server.on('request', function (req, res) {
  // / index.html
  var url = req.url

  if (url === '/') {
   
    // 我们要发送的还是在文件中的内容
    fs.readFile('./resource/index.html', function (err, data) {
      if (err) {
        res.setHeader('Content-Type', 'text/plain; charset=utf-8')
        res.end('文件读取失败,请稍后重试!')
      } else {
        // data 默认是二进制数据,可以通过 .toString 转为咱们能识别的字符串
        // res.end() 支持两种数据类型,一种是二进制,一种是字符串
        res.setHeader('Content-Type', 'text/html; charset=utf-8')
        res.end(data)
      }
    })
  } else if (url === '/xiaoming') {
    // url:统一资源定位符
    // 一个 url 最终其实是要对应到一个资源的
    fs.readFile('./resource/ab2.jpg', function (err, data) {
      if (err) {
        res.setHeader('Content-Type', 'text/plain; charset=utf-8')
        res.end('文件读取失败,请稍后重试!')
      } else {
        // data 默认是二进制数据,可以通过 .toString 转为咱们能识别的字符串
        // res.end() 支持两种数据类型,一种是二进制,一种是字符串
        // 图片就不需要指定编码了,因为我们常说的编码一般指的是:字符编码
        res.setHeader('Content-Type', 'image/jpeg')
        res.end(data)
      }
    })
  }
})

server.listen(3000, function () {
  console.log('Server is running...')
})

LUYrty樱花
29 声望3 粉丝