Node——Apache

1. https

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

var server = http.createServer()

var wwwDir = '文件路径'

server.on('request', function (req, res){
    var url = req.url
    fs.readFile('./template.html', function (err, data){
        if (err) {
            return res.end('404 Not Found')
        }
    // 1. 如何得到 wwwDir 目录列表中的文件名和目录名
    //    fs.readdir
    // 2. 如何将得到的文件名和目录名替换到 template.html 中
    //    2.1 在 template.html 中需要替换的位置预留一个特殊的标记(就像以前使用模板引擎的标记一样)
    //    2.2 根据 files 生成需要的 HTML 内容
    // 只要你做了这两件事儿,那这个问题就解决了
        
    fs.readdir(wwwDir, function (err, files) {
      if (err) {
        return res.end('Can not find www dir.')
      }

       // 2.1 生成需要替换的内容
      var content = ''
      files.forEach(function (item) {
        // 在 EcmaScript 6 的 ` 字符串中,可以使用 ${} 来引用变量
            content += `
              <tr>
                    <td data-value="www/">
                        <a class="icon dir" href="/F:/JOB/SSTUDY/WEB%E5%89%8D%E7%AB%AF/test/nodejs/two/www/">${item}</a>
                    </td>
                    <td class="detailsColumn" data-value="0"></td>
                    <td class="detailsColumn" data-value="1541061252">2018/11/1 下午4:34:12</td>
                </tr>
            `
          })

              // 2.3 替换
            data = data.toString()
          data = data.replace('^_^', content)

          // 3. 发送解析替换过后的响应数据
            res.end(data)
        })
    })
})
server.listen(3000, function () {
    console.log('running...')
})

2. 加载与导出 a.js加载b.js

a.js

// require 方法有两个作用:
//    1. 加载文件模块并执行里面的代码
//    2. 拿到被加载文件模块导出的接口对象
//    
//    在每个文件模块中都提供了一个对象:exports
//    exports 默认是一个空对象
//    你要做的就是把所有需要被外部访问的成员挂载到这个 exports 对象中
var bExports = require('./b')
var fs = require('fs')

console.log(bExports.foo)

console.log(bExports.add(10, 30))

console.log(bExports.age)

bExports.readFile('./a.js')

fs.readFile('./a.js', function (err, data) {
  if (err) {
    console.log('读取文件失败')
  } else {
    console.log(data.toString())
  }
})

b.js

var foo = 'bbb'

// console.log(exports)

exports.foo = 'hello'

exports.add = function (x, y) {
  return x + y
}

exports.readFile = function (path, callback) {
  console.log('文件路径:', path)
}

var age = 18

exports.age = age

function add(x, y) {
  return x - y
}

3. 获取IP端口号

// ip 地址用来定位计算机
// 端口号用来定位具体的应用程序
// 所有需要联网通信的应用程序都会占用一个端口号

var http = require('http')

var server = http.createServer()

// 2. 监听 request 请求事件,设置请求处理函数
server.on('request', function (req, res) {
  console.log('收到请求了,请求路径是:' + req.url)
  console.log('请求我的客户端的地址是:', req.socket.remoteAddress, req.socket.remotePort)

  res.end('hello nodejs')
})

server.listen(5000, function () {
  console.log('服务器启动成功,可以访问了。。。')
})

4. 文件读取

// 1. 结合 fs 发送文件中的数据
// 2. Content-Type
//    http://tool.oschina.net/commons
//    不同的资源对应的 Content-Type 是不一样的
//    图片不需要指定编码
//    一般只为字符数据才指定编码

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 === '/') {
    // 肯定不这么干
    // res.end('<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Document</title></head><body><h1>首页</h1></body>/html>')

    // 我们要发送的还是在文件中的内容
    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 === '/a') {
    // 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...')
})

5. Apache目录列表

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

var server = http.createServer()
var wwwDir = '文件路径'
server.on('request', function (req, res){
    var url = req.url
    fs.readFile('./template.html', function (err, data){
        if (err) {
            return res.end('404 Not Found')
        }
    // 1. 如何得到 wwwDir 目录列表中的文件名和目录名
    //    fs.readdir
    // 2. 如何将得到的文件名和目录名替换到 template.html 中
    //    2.1 在 template.html 中需要替换的位置预留一个特殊的标记(就像以前使用模板引擎的标记一样)
    //    2.2 根据 files 生成需要的 HTML 内容
    // 只要你做了这两件事儿,那这个问题就解决了
        
    fs.readdir(wwwDir, function (err, files) {
      if (err) {
        return res.end('Can not find www dir.')
      }
       // 2.1 生成需要替换的内容
      var content = ''
      files.forEach(function (item) {
        // 在 EcmaScript 6 的 ` (反引号)字符串中,可以使用 ${} 来引用变量
            content += `
              <tr>
                    <td data-value="www/">
                        <a class="icon dir" href="/F:/JOB/SSTUDY/WEB%E5%89%8D%E7%AB%AF/test/nodejs/two/www/">${item}</a>
                    </td>
                    <td class="detailsColumn" data-value="0"></td>
                    <td class="detailsColumn" data-value="1541061252">2018/11/1 下午4:34:12</td>
                </tr>
            `
          })
              // 2.3 替换
            data = data.toString()
          data = data.replace('^_^', content)
          // 3. 发送解析替换过后的响应数据
            res.end(data)
        })
    })
})
server.listen(3000, function () {
    console.log('running...')
})

小结

  • Node.js 是什么

    • JavaScript 运行时
    • 既不是语言,也不是框架,它是一个平台
  • Node.js 中的 JavaScript

    • 没有 BOM、DOM

    • EcmaScript 基本的 JavaScript 语言部分

    • 在 Node 中为 JavaScript 提供了一些服务器级别的 API

      • 文件操作的能力
      • http 服务的能力

总结

  • Node 中的 JavaScript

    • EcmaScript

    • 变量

    • 方法

    • 数据类型

    • 内置对象

    • Array

    • Object

    • Date

    • Math

    • 模块系统

      • 在 Node 中没有全局作用域的概念

      • 在 Node 中,只能通过 require 方法来加载执行多个 JavaScript 脚本文件

      • require 加载只能是执行其中的代码,文件与文件之间由于是模块作用域,所以不会有污染的问题

        • 模块完全是封闭的
        • 外部无法访问内部
        • 内部也无法访问外部
      • 模块作用域固然带来了一些好处,可以加载执行多个文件,可以完全避免变量命名冲突污染的问题

      • 但是某些情况下,模块与模块是需要进行通信的

      • 在每个模块中,都提供了一个对象:exports

      • 该对象默认是一个空对象

      • 你要做的就是把需要被外部访问使用的成员手动的挂载到 exports 接口对象中

      • 然后谁来 require 这个模块,谁就可以得到模块内部的 exports 接口对象

      • 还有其它的一些规则,具体后面讲,以及如何在项目中去使用这种编程方式,会通过后面的案例来处理

    • 核心模块

      • 核心模块是由 Node 提供的一个个的具名的模块,它们都有自己特殊的名称标识,例如

      • fs 文件操作模块

      • http 网络服务构建模块

      • os 操作系统信息模块

      • path 路径处理模块

      • 。。。。

      • 所有核心模块在使用的时候都必须手动的先使用 require 方法来加载,然后才可以使用,例如:

        • var fs = require(‘fs’)
  • http

    • require

    • 端口号

      • ip 地址定位计算机
      • 端口号定位具体的应用程序
    • Content-Type

      • 服务器最好把每次响应的数据是什么内容类型都告诉客户端,而且要正确的告诉
      • 不同的资源对应的 Content-Type 是不一样,具体参照:http://tool.oschina.net/commons
      • 对于文本类型的数据,最好都加上编码,目的是为了防止中文解析乱码问题
    • 通过网络发送文件

      • 发送的并不是文件,本质上来讲发送是文件的内容
      • 当浏览器收到服务器响应内容之后,就会根据你的 Content-Type 进行对应的解析处理
  • 模块系统

  • Node 中的其它的核心模块

  • 做一个小管理系统:

    • CRUD
  • Express Web 开发框架

    • npm install express
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值