Node.js 简介与提供原生接口服务

JavaScript语言在浏览器需要解析执行,浏览器的内核进行解析;浏览器的内核主要包括两部分:js引擎(解析器)和渲染引擎

  • js引擎负责解析并允许JavaScript代码

  • 渲染引擎负责把HTML和CSS渲染成页面效果

浏览器除了提供js引擎之外,还提供了WebAPI(BOM、DOM...)

Node.js是什么?

  • nodejs是一个开发平台,这个平台上可以进行软件开发,并且开发出功能更加强大的软件(网站),并且在这个平台上进行开发很方便,因为nodejs提供了丰富的API和优秀的运行性能

  • 在nodejs平台中开发语言使用的依然是JavaScript

Node.js可以做什么?

  • 服务端Web开发,就是做网站(操作数据库)

  • java、Python、PHP、ruby、go、nodejs...

  • 服务端后台接口API项目

  • 桌面程序(基于eletron)

  • Typora

  • VSCode

  • Postman

  • 命令行工具

  • App (IOS-swift/Android-java)

  • uniapp(vue)

  • react native

Node.js开发环境配置

  1. 关于命令行用法补充

命令行:操作计算机的一种方式;另一种是图形化界面

  • 打开命令行三种方式

  • window + R,在出现的窗口中输入 cmd,回车

  • 鼠标放到文件路径中,输入 cmd,回车

  • 切换盘符命令:f: mac无盘符

  • cd 切换目录命令

  • cd .. 切上一层

  • cd ./文件名 切到当前路径下目录中

  • cd D:\my\code 切换到指定路径中

  • 查看当前目录下的文件 dir

  • 清屏: cls

  • 创建文件夹: mkdir + 文件夹名称

  1. 安装配置Node.js环境

  • 官网下载

  • 安装

  • node -v 查看版本

Node.js体验

  1. 命令行窗口执行(输入node,出现 >)

退出命令行环境(两次 ctrl + c 或 .exit)

  1. 代码写到文件中运行

  1. 必须在js文件所在的目录中运行node命令

Node.js核心模块介绍

核心模块提供了开箱即用的丰富的API,方便开发项目时调用

  • 文件操作(文件的读写操作)

  • 网络通信(处理客户端请求并返回结果)

  • 进程管理

  • ...

fs模块,文件系统(File System)

操作系统(windows/mac/linux)的只要职能是管理硬件和软件硬盘,硬盘中的数据需要管理,由操作系统的文件系统进行管理;从编程的角度也可以通过API进行文件操作(读文件,写文件)

  • fs文件系统模块用于异步操作文件的方法

  • 读取文件内容 fs.readFile

  • 写入文件内容 fs.writeFile

  • fs文件系统模块用于同步操作文件的方法

  • 读取文件内容 fs.readFileSync

  • 写入文件内容 fs.writeFileSync

// 异步读写文件操作
// 读文件操作
// 1.导入模块(核心模块的名称是fs,固定的)
const fs = require('fs')
// 2.调用核心模块中的方法操作文件
// 参一:表示文件的路径
// 参二:表示读取内容的编码:utf-8
// 参三:表示读取文件成功的回调函数
fs.readFile('./文件名', 'utf-8', function(err, data) {
    // err表示错误提示:如果err为null表示读取成功;否则表示错误提示
    // data表示读取到的具体数据
    if(err) {
        console.log(err)
        return
    }
    console.log(data)
})

// 写文件操作
// 1.导入核心模块
const fs = require('fs')
// 2.调用方法进行写文件(内存->硬盘)
const msg = 'Hi'
// 参一:写文件的路径
// 参二:写入的内容
// 参三:写入的文本的编码
fs.writeFile('./文件名', msg, 'utf-8', function(err){
    // 写入成功与否的标志,null表示写入成功,否则表示错误信息
    if(err === null) {
        // 写入成功
        console.log('写入文件成功')
    }
})
// 同步读写文件操作
// 读文件操作
const fs = require('fs')
let res = fs.readFileSync('./文件名', 'utf-8')
console.log(res)

// 写文件操作
const fs = require('fs')
const msg = 'Hi'
fs.writeFileSync('./文件名', msg, 'utf-8')
console.log('成功写入')

path模块

node 提供了path模块用于简化路径的操作,路径的本质就是有格式的字符串

path.sep:自动检测平台环境,根据环境自动选择斜杠类型 ( \ 或 / )

path.join:拼接路径并且对路径进行规范化处理

// D:\my\code\文件
// /home/abc/hello/msg
const path = require('path')
const fs = require('fs')
// path.sep 作用:自动检测平台环境,根据环境自动选择斜杠类型
// windows \
// mac/linux/unix  /
const res = fs.readFileSync(__dirname + path.sep + '文件名', 'utf-8')

// 拼接路径并且对路径进行规范化处理
const pstr = path.join(__dirname, '../文件名')
console.log(pstr)
const ret = fs.readFileSync(pstr, 'utf-8')

const str = path.join(__dirname, 'abc', '../xxx', 'bbb', 'index.js')
  • ./ 表示命令行当前所处的路径

  • __dirname:表示当前执行的js文件所处的路径,node全局变量不用定义

// 如果希望命令行任何路径的位置之下都可以执行上述操作
const fs = require('fs')
const res = fs.readFileSync(__dirname + '/文件名', 'utf-8')

http模块

服务器提供web服务基本流程

关于请求对象req的两个属性的作用

  • req.url表示请求地址中的路径(端口后的部分)

  • req.method表示客户端的请求方式(GET|POST|PUT|DELETE)

  • 后端可以根据这两个属性的组合分支判断实现多个接口

// 提供接口服务
// 1.导入核心模块
const http = require('http')
// 2.基于http模块提供的方法实现接口服务
// 2.1 创建一个服务器实例对象
const server = http.createServer()
// 2.2 监听端口(0~65535)
// 3000表示端口:端口用于区分电脑中的那个网络应用程序
server.listen(3000, function() {
    // 监听成功后,该回调函数会执行
    console.log('running...')
})
// 3.监听客户端发送的请求动作
// 如果客户想3000端口发送了请求,那么如下的事件request会触发对应的回调函数就会执行
server.on('request', function(req, res) {
    // req 请求对象,用于处理请求相关信息
    // res 响应对象,用于处理响应相关信息
    res.end('hello world') // 响应客户端请求的结果
})

// 接口服务细节分析
server.on('request', function(req, res) {
    // req.url表示请求地址中的路径(端口后的部分)
    // req.method表示客户端请求的方式(GET|POST|PUT|DELETE)
    if(req.url === '/getbooks' && req.method === 'GET') {
        // 查书
        res.end('getbooks')
    } else if(req.url === '/addbook' && req.method === 'POST') {
        // 添加图书
        res.end('addbook')
    } else if(req.url === '/delbook' && req.method === 'GET') {
        // 删书
        res.end('delbook')
    } else {
        res.end('not found!')
    }
})

服务器介绍

职能:提供服务(网页服务,视频服务,音频服务,邮箱服务...)数据接口服务

大量的数据资源需要存储在服务器中,客户端要想看到,需先请求对应资源加载到客户端才能呈现

  • 客户端请求时,服务器的这些资源是如何返回给客户端的?

  • 文件读取;文件写入-上传文件

  • 服务器如何处理客户端请求?

  • 需要协议,对于这些协议,Node.js实现了相关的API,从而处理请求

原生nodejs提供接口服务

接口服务主要有两个核心流程:处理网络通信、文件读写操作

文件 books.txt

[
    {
        "id": 1,
        "bookname": "node深入浅出",
        "author": "朴灵",
        "publisher": "人民邮电出版社"
    }
]

文件 myserver.js

// 1.导入核心模块
const http = require('http')
const path = require('path')
const fs = require('fs')
// 2.基于http模块提供的方法实现接口服务
// 2.1 创建一个服务器实例对象
const server = http.createServer()
// 2.2 监听端口
server.listen(3000, function() {
    console.log('3000, running...')
})
// 3.监听客户端发送的请求动作
server.on('request', function(req, res){
    if() {
        const filePath = path.join(__dirname, './books.txt')
        res.setHeader('Content-type', 'application/json; charset=utf8')
        fs.readFile(filePath, 'utf-8', function(err, data) {
            if(err) {
                // 读取失败
                res.end('server error')
                return
            }
            // 正常返回数据
            res.end(JSON.stringify({
                code: 0,
                msg: '获取图书列表成功',
                data: data
            }))
        })
    }
    ...
})
  • 设置响应数据的格式和编码

  • 设置响应头:告诉浏览器服务器返回的数据格式和编码是什么情况

res.setHeader('Content-type', 'application/json; charset=utf8')
  • 删除图书接口 localhost:3000/delbook?id=1

  • 读取原始文件

  • 删除数据(处理)

  • 写回处理后结果到文件

else if(req.url.indexOf('/delbook') === 0 && req.method === 'GET') {
    // req.url = /delbook?id=1
    // 获取要删除的图书的id
    let id = null
    if(req.url.indexOf('id=') !== -1) {
        id = req.url.substring(req.url.lastIndexOf('=') + 1)
    }
    if(id === null) {
        // 前端没有传递id值
        res.end('请传递图书id')
        return
    }
    // 删除图书
    // 1.读取所有的文件数据,到变量(内存)中
    const filePath = path.join(__dirname, './books.txt')
    const books = fs.readFileSync(filePath, 'utf-8')
    // 2.把读取到的数据删除一条(根据id删除)
    let booksArr = JSON.parse(books)
    booksArr = booksArr.filter(function(item) {
        return item.id !== parseInt(id)
    })
    // 3.把剩余的数据写回文件中
    fs.writeFileSync(filePath, JSON.stringify(booksArr), 'utf-8')
    // 4.返回状态信息
    res.end(JSON.stringify({
        code: 0,
        msg: '删除图书成功'
    }))
} else {
    res.end('not found!')
}

总结:监听前端请求,操作文件、响应状态

  • 获取请求参数

  • 删除流程:读文件;操作数组;写文件

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值