Node.js简易教程

目录

介绍

fs模块

演示

writeFile 异步写入

 appendFile/appendFileSync 追加写入

 createWriteStream流式写入

readFile异步读取文件/readFileSync同步读取文件

 createReadStream流式读取

 文件移动与重命名

 文件删除

 http模块

创建服务

url 格式化

 获取静态文件服务

 node模块化

什么是模块化与模块

什么是模块化项目

模块化优点


介绍

Node.js是JavaScript语言的服务器运行环境。

Node.js 就是运行在服务端的 JavaScript。
Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台。
Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好。

fs模块

fs模块可以实现与硬盘的交互 

例如 文件的创建 删除,重命名 修改 移动等 还有文件内容的写入 读取以及文件夹的相关操作

演示

writeFile 异步写入

语法: fs.writeFile(file, data[options], callback)

参数说明:

file: 文件名

data: 待写入的数据

options:选项设置(可选)

callback: 写入回调函数

返回值: undefined

//导入fs 模块
const fs = require('fs');
//写入文件
fs.writeFile('./户雨.txt', '今日不会下雨吧', err => {
    //err 写入失败:错误对象  写入成功:null
    if (err) {
        console.log('写入失败');
        return;
    }
})

测试

 

 appendFile/appendFileSync 追加写入

appendFile作用是在文件尾部追加内容 appendFile语法与wirteFile语法完全相同

fs.appendFile(file,data[, options], callback)(异步)

fs.appendFileSync(file, data[, options])(同步)

返回值: 二者都为 undefined

const fs = require('fs')
//调用appendFile
fs.appendFile('./户雨.txt','\r\n应该不会下雨',err=>{
    if(err){
        console.log('写入失败');
        return
    }
    console.log('写入成功');
})

 

 使用writeFile也可以实现追加写,只需要在参数中添加{flag:'a'}参数即可

 

 createWriteStream流式写入

语法 fs.createWriteStream(path[,options])

参数说明: 

path: 文件路径

options: 选项配置(可选)

返回值: Object

const fs = require('fs')
    //创建写入流对象
let ws = fs.createWriteStream('./早发白帝城.txt');
ws.write('朝辞白帝彩云间\r\n')
ws.write('千里江陵一日还\r\n')
ws.write('两岸猿声啼不住\r\n')
ws.write('还有一句忘了...\r\n')
    //关闭写入流
ws.close();

 程序打开一个文件是需要消耗资源的 流式写入可以减少打开关闭文件的次数

流式写入方式适用于 大文件写入或者频繁写入的场景 writeFile适合于写入频繁较低的场景

readFile异步读取文件/readFileSync同步读取文件

语法: fs.readFile(path[,options],callback)

参数说明:

path: 文件路径

options: 选项配置(可选)

callback: 回调函数

返回值 :undefined

const fs = require('fs');
fs.readFile('./早发白帝城.txt', (err, data) => {
    if (err) {
        console.log('读取失败');
        return;
    }
    console.log(data.toString());
})

 也可以直接使用同步读取

 createReadStream流式读取

这里直接使用流式读取和流式写入一个图片当做演示

 

 

 文件移动与重命名

在node.js中, 可以使用rename或renameSync来移动或重名名文件或文件夹

语法:

fs.rename(oldPath,newPath,callback) (异步)

fs.renameSync(oldPath,newPath) (同步)

参数说明:

oldPath: 旧文件路径

newPath: 新文件路径

callback:回调函数

const fs = require('fs')
//移动文件
fs.rename('./户雨.txt','../../part2/天气.txt',err=>{
    if(err){
        console.log('操作失败');
        return;
    }
    console.log('操作成功')
})

 

 文件删除

在node中可以使用unlink或unlinkSync来删除文件 在node.js14版本之后也可以通过fs.rm来进行文件删除

fs.unlink(path,callback)

fs.unlinkSync(path)

参数说明:

path: 文件路径

callback:回调函数

const fs = require('fs')
    //删除文件
fs.unlink('./天气.txt', err => {
    if (err) {
        console.log('删除失败');
        return;
    }
    console.log('删除成功');
})

 

 http模块

创建服务

//导入http模块
const http = require('http');
//创建服务对象
const server = http.createServer((request, response) => {
        response.setHeader('content-type', 'text/html;charset=utf-8')
        response.end('你好 世界');
    })
    //监听端口 启动服务
server.listen(9000, () => {
    console.log('服务已经启动')
})

 注意,在服务监听处如果不明确指出监听端口,则默认监听80端口

url 格式化

通过url模块可以直接获取请求地址的路径和参数

//导入http模块
const http = require('http');
//导入url模块
const url = require('url');
//创建服务对象
const server = http.createServer((request, response) => {

        //解析 requset.url
        let res = url.parse(request.url, true)
        console.log(res)

        //设置请求头
        response.setHeader('content-type', 'text/html;charset=utf-8')
        response.end('你好啊 世界');
    })
    //监听端口 启动服务
server.listen(80, () => {
    console.log('服务已经启动')
})

 浏览器输入路径并且拼接路径参数

http://127.0.0.1/queryName?name=%E5%BC%A0%E9%A3%9E&age=12

回车发起请求

 获取静态文件服务

//导入http模块
const http = require('http');
const fs = require('fs');
//创建服务对象
const server = http.createServer((request, response) => {

        //解析 requset.url
        let { pathname } = new URL(request.url, 'http://127.0.0.1');
        console.log(pathname)
            //拼接文件路径
        let filePath = __dirname + pathname;
        //读取文件 fs 异步 api
        fs.readFile(filePath, (err, data) => {
            if (err) {
                response.statusCode = 500;
                response.end('文件获取失败')
                return;
            }
            response.setHeader('content-type', 'text/html;charset=utf-8')
                //设置响应文件内容
            response.end(data)
        })
        console.log('我要的路径' + filePath)
    })
    //监听端口 启动服务
server.listen(9000, () => {
    console.log('服务已经启动')
})

测试获取静态文件

 再获取app.js

 

 node模块化

什么是模块化与模块

将一个复杂的程序文件依据一定规则(规范)拆分成多个文件的过程称之为 模块化

其中拆分出的每个文件就是一个模块 模块的内部数据是私有的 不过模块可以暴露内部数据以便其他模块使用

什么是模块化项目

编码时是按照模块一个一个编码的 整个项目就是一个模块化的项目

模块化优点

防止命名冲突

高复用性和高维护性

接口token校验

token是服务端生成并返回给http客户端的一串加密字符串 token中保存和用户信息

token可以实现会话控制 可以识别用户的身份 

填写账号和密码校验身份 校验通过后响应 token token一般是在响应体中返回给客户端

首先安装jsonwentoken模块

npm i jsonwebtoken

生成格式: jwt.sign(用户数据,加密字符串,配置对象)

let token = jwt.sign({ username: "张飞", password: '123456' },

    'jiami', {

        expiresIn: 60 //失效时间

    }

)

校验格式:jwt.verify(token,加密字符串,回调)

jwt.verify(token, 'jiami', (err, data) => {

    if (err) {

        console.log('校验失败');

        return;

    }

    console.log(data)

})

 

书写自定义路由

const express = require('express');
const jwt = require('jsonwebtoken');
//创建路由对象
const router = express.Router();
//配置路由地址
router.get('/admim', (req, res) => {
    res.send('后台首页')
});

router.get('/setting', (req, res) => {
    res.send('设置页面')
})

//配置路由地址
router.post('/login', (req, res) => {
    let user = { name: '', password: '' };
    user = req.query
    let token = jwt.sign(user, "jiami", {
        expiresIn: 60 * 60
    })
    if (token) {
        res.json({ status: 200, token: token })
    }

    console.log(token)
});

router.post('/admin', (req, res) => {
    let token = req.headers.token
    if (!token) {
        console.log('用户未登录,请先登录')
        return res.status(401).json({ error: '用户未登录,请先登录' });
    }
    jwt.verify(token, 'jiami', (error, data) => {
        if (error) {
            return res.status(402).json({ error: 'token验证失败' });
        }
        console.log(data)
    })

    return res.status(200).json({ todo: '开始后续操作' });
});
module.exports = router;
// exports.router = router;

书写服务端

//导入 express
const express = require('express')
    //导入自定义路由
const router = require('./myRouter')
    //创建应用对象
const app = express();
//创建路由
app.get('/home', (req, res) => {
    // res.setHeader('content-type', 'text/html;charset=utf-8')
    // res.send('hello word 世界你a asda萨达好');
    res.json({
        name: "张飞",
        qun: '车骑将军'
    })
});
//应用自定义路由
app.use(router);
//监听端口 启动服务
app.listen(9000, () => {
    console.log('服务已启动');
})

启动测试:

使用apipost测试接口:

 先测试登录接口

 再测试admin接口,

首先测试不加token的情况

 再测试token添加错误的情况

测试成功的情况,把刚才测试login接口返回的token放在header中

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值