【Node.js】一文带你开发博客项目之接口(处理请求、搭建开发环境、开发路由)

news2025/2/25 4:09:11

个人简介

👀个人主页: 前端杂货铺
🙋‍♂️学习方向: 主攻前端方向,也会涉及到服务端
📃个人状态: 在校大学生一枚,已拿 offer(秋招)
🥇推荐学习:🍍前端面试宝典 🍉Vue2 🍋Vue3 🍓Vue2&Vue3项目实战 🥝Node.js

Node.js系列文章目录

内容参考链接
Node.js(一)初识 Node.js

文章目录

  • Node.js系列文章目录
    • 一、http 请求概述
    • 二、处理请求
      • 1、处理 get 请求
      • 2、处理 post 请求
    • 三、搭建开发环境
      • 1、搭建环境
      • 2、安装 nodemon
    • 四、开发路由
      • 1、初始化路由
      • 2、使用 Promise 读取文件
    • 五、写在最后


一、http 请求概述

  • DNS 解析,建立 TCP 连接,发送 http 请求
  • server 接收 http 请求,处理,并返回
  • 客户端接收到返回数据,处理数据(如渲染页面,执行 JS)

二、处理请求

1、处理 get 请求

  • get 请求,即客户端要向 server 端获取数据,如查询博客列表
  • 通过 querystring 来传递数据,如 a.html?a=100&b=200
  • 浏览器直接访问,就发送 get 请求

示例:GET 请求

// 获取 node.js 提供的原生 http 模块
const http = require('http')
const querystring = require('querystring')

// 创建服务
const server = http.createServer((req, res) => {
    console.log('method: ', req.method) // GET
    const url = req.url // 获取请求的完整 url
    console.log('url: ', url)
    req.query = querystring.parse(url.split('?')[1]) // 解析 querystring
    console.log('query: ', req.query)
    res.end(JSON.stringify(req.query)) // 将 querystring 返回
})

// 监听端口
server.listen(8000)
console.log('OK')

在这里插入图片描述
在这里插入图片描述

2、处理 post 请求

  • post 请求,即客户端要像服务端传递数据,如新建博客
  • 通过 post data 传递数据
  • 浏览器无法直接模拟,需要手写 js,或者使用 postman

示例:POST 请求

const http = require('http')

// 创建服务
const server = http.createServer((req, res) => {
	// POST 请求
    if (req.method === 'POST') {
        // req 数据格式
        console.log('req content-type', req.headers['content-type'])
        // 接收数据
        let postData = ''
        // 每次来数据都会触发 data 事件
        req.on('data', chunk => {
            postData += chunk.toString()
        })
        req.on('end', () => {
            console.log('postData: ', postData)
            res.end('hello world')
        })
    }
})
// 监听端口
server.listen(8000)
console.log('OK')

测试:使用 postman 或者 ApiPost

在这里插入图片描述

在这里插入图片描述

三、搭建开发环境

  • 从 0 开始搭建,不使用任何框架
  • 使用 nodemon 监测文件变化,自动重启 node
  • 使用 cross-env 设置环境变量,兼容 windows mac 和 linux

1、搭建环境

文件格式如下:

在这里插入图片描述

更改 main 的值:

在这里插入图片描述

app.js 文件

const serverHandle = (req, res) => {
    // 设置返回格式 JSON
    res.setHeader('Content-type', 'application/json')
    // 返回的数据
    const resData = {
        name: '杂货铺',
        site: 'CSDN'
    }
    // 服务器端要返回给客户端的数据
    res.end(
        JSON.stringify(resData)
    )
}
// 模块化 把 serverHandle 暴露出去
module.exports = serverHandle

www.js 文件

const http = require('http')

// 端口
const PORT = 8000
// 引入 app.js
const serverHandle = require('../app')
// 创建服务
const server = http.createServer(serverHandle)
// 监听端口
server.listen(PORT)

在当前文件夹路径下终端键入 node bin/www.js 启动服务,打开 8000 端口

在这里插入图片描述

2、安装 nodemon

nodemon 作用:可以监控文件变化,自动重启,无需手动

安装 nodemon,终端键入如下命令:

npm install nodemon cross-env --save-dev 

在 package.json 中 添加 如下内容(测试环境,兼容多种操作系统):

在这里插入图片描述

四、开发路由

1、初始化路由

  • 初始化路由:根据技术方案的设计,做出路由
  • 返回假数据:将路由和数据处理分离,以符合设计规则

在这里插入图片描述
示例:开发接口,并测试使用

文件格式如下:

在这里插入图片描述

www.js 文件

  • 创建服务,监听端口
  • 最终 nodemon ./bin/www.js 运行就是在此文件位置
const http = require('http')

// 端口
const PORT = 8000
// 引入 app.js
const serverHandle = require('../app')
// 创建服务
const server = http.createServer(serverHandle)
// 监听端口
server.listen(PORT)

app.js 文件

  • 整合的文件
  • 处理 blog 和 user 的相关接口
const handleBlogRouter = require('./src/router/blog')
const handleUserRouter = require('./src/router/user')

const serverHandle = (req, res) => {
    // 设置返回格式 JSON
    res.setHeader('Content-type', 'application/json')

    // 获取 path
    const url = req.url
    req.path = url.split('?')[1] // 获取 ? 的后半部分

    // 处理 blog 路由
    const blogData = handleBlogRouter(req, res)
    if (blogData) {
        res.end(
            JSON.stringify(blogData)
        )
        return
    }

    // 处理 user 路由
    const userData = handleUserRouter(req, res)
    if (userData) {
        res.end(
            JSON.stringify(userData)
        )
        return
    }

    // 未命中路由,返回 404
    res.writeHead(404, {"Content-type": "text/plain"})
    res.write("404 Not Found\n")
    res.end()
}
// 模块化 把 serverHandle 暴露出去
module.exports = serverHandle

blog.js 文件

  • 博客相关接口
  • 最后暴露出去
const handleBlogRouter = (req, res) => {
    const method = req.method // GET POST

    // 获取博客列表
    if (method === 'GET' && req.path === '/api/blog/list') {
        return {
            msg: '这是获取博客列表的接口'
        }
    }

    // 获取博客详情
    if (method === 'GET' && req.path === '/api/blog/detail') {
        return {
            msg: '这是获取博客详情的接口'
        }
    }

    // 新建一篇博客
    if (method === 'POST' && req.path === '/api/blog/new') {
        return {
            msg: '这是新建博客的接口'
        }
    }

    // 更新一篇博客
    if (method === 'POST' && req.path === '/api/blog/update') {
        return {
            msg: '这是更新博客的接口'
        }
    }

    // 删除一篇博客
    if (method === 'POST' && req.path === '/api/blog/delete') {
        return {
            msg: '这是删除博客的接口'
        }
    }
}

module.exports = handleBlogRouter

user.js 文件

  • 登录相关接口
  • 最后暴露出去
const handleUserRouter = (req, res) => {
    const method = req.method

    // 登录
    if (method === 'POST' && req.path === '/api/user/login') {
        return {
            msg: '这是登录接口'
        }
    }
}

module.exports = handleUserRouter

测试如下:

获取博客列表:

在这里插入图片描述

获取博客详情:

在这里插入图片描述

资源未找到 404:

在这里插入图片描述

2、使用 Promise 读取文件

示例:使用 Promise 读取三个 json 文件

a.json 文件

{
    "next": "b.json",
    "msg": "this is a"
}

b.json 文件

{
    "next": "c.json",
    "msg": "this is b"
}

c.json 文件

{
    "next": null,
    "msg": "this is c"
}

index.js 文件

  • 封装获取文件内容的函数
  • 依次读取文件内容
const fs = require('fs')
const path = require('path')

// 用 promise 获取文件内容
function getFileContent(fileName) {
    const promise = new Promise((resolve, reject) => {
        // 获取文件全名, __dirname 表示当前文件所在的目录
        const fullFileName = path.resolve(__dirname, 'files', fileName)
        // 读取文件
        fs.readFile(fullFileName, (err, data) => {
        	// 失败
            if (err) {
                reject(err)
                return
            }
            // 成功
            resolve(
                JSON.parse(data.toString())
            )
        })
    })
    // 返回 promise 实例
    return promise
}

// then 的链式调用
getFileContent('a.json').then(aData => {
    console.log('a data', aData)
    return getFileContent(aData.next)
}).then(bData => {
    console.log('b data', bData)
    return getFileContent(bData.next)
}).then(cData => {
    console.log('c data', cData)
})

终端键入 nodemon index.js 测试结果如下:

在这里插入图片描述

五、写在最后

至此,我们学会了请求的处理,搭建开发环境以及路由的开发。继续跟进学习吧!

后续会对该项目进行多次重构【多种框架(express,koa)和数据库(mysql,sequelize,mongodb)】

如果你需要该项目的 源码,请通过本篇文章最下面的方式 加入 进来~~


在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/405633.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信小程序实现文字长按复制、一键复制功能

一、不引入外部组件的实现方式 <!-- index.wxml --> <view><!-- 长按复制 --><view bindlongtap"copyText" data-key"{{item.cdkey}}">{{ item.cdkey }}</view><text bindlongtap"copyText" data-key"{{i…

【Web实战-Tomcat-Servlet-Thymeleaf -JDBC-MySQL】浏览器页面显示数据库数据(水果库存系统)

&#x1f947;作者 .29. 的✔博客主页✔ &#x1f947;记录JavaWeb学习的专栏&#xff1a;Web专栏 &#x1f947;拼搏起来吧&#xff0c;未来会给你开出一个无法拒绝的条件… 您的点赞&#xff0c;收藏以及关注是对作者最大的鼓励喔 ~~ 客户端展示库存数据前言一、Thymeleaf - …

每天一个CSS小特效,文字闪烁——【钢铁侠:爱你三千遍】

文章目录前言效果图HTML篇CSS篇1. 盒子模型设置2. 动画设置完整代码前言 我是前端小刘不怕牛牛&#xff0c;love you 3000&#xff0c;愿你能遇到值得的人。 今天分享一个唯美的文字闪烁CSS特效 希望大家能喜欢 效果图 HTML篇 代码&#xff1a; <div class"main"…

uniapp中获取dom元素的方法,更改dom元素颜色(遇坑记录)

前言 最近写uniapp&#xff0c;遇到一个需要获取到页面中dom元素&#xff0c;我第一反应是使用this.$ refs进行获取&#xff0c;于是我开心的使用this.$refs写了很多代码&#xff0c;使用h5调试的过程中没有发现任何问题&#xff0c;但后来真机调试的时候发现在app端无效&…

npm安装报错(npm ERR! code EPERM npm ERR! syscall mkdir npm ERR! path C:\Program Files\nodejs\node_ca...)

使用npm安装时候报错了 根据网上经验解决方法&#xff1a; 1.删除.npmrc文件 该文件在&#xff1a;C:\Users{账户}\下的.npmrc文件&#xff0c; 一般这种类型的都是默认被隐藏&#xff0c;一定要选择将隐藏取消掉 删掉即可。 注意&#xff1a;当前方式确实是最有效的操作&…

猿创征文|如何在HbuilderX中运行Vue

第一步&#xff1a;安装Node.js 这里不加赘述&#xff0c;是傻瓜式安装 第二步&#xff1a;找到安装的Node在哪里 如果找不到可以打开cmd 输入 where node 第三步&#xff1a;打开HbuilderX 点击工具 选择设置 如图&#xff1a; 选择运行配置 ②③的位置是需要填写的位置 使用我…

vue项目首屏加载过慢解决方案

前言 因为我的一个vue项目首页打开加载了好久&#xff0c;所以决定优化一下。发现是打包体积太大了&#xff0c;页面才加载慢主要是第三方库。 优化着优化着就想要更好一点&#xff0c;于是逛博客搜索&#xff0c;参照了几个博主的解决方法整理出一下几点。​ 一、防止编译文…

如何在vscode里面快速运行html代码(包含如何在vscode里面编写html代码)

前言必读 读者手册&#xff08;必读&#xff09;_云边的快乐猫的博客-CSDN博客 前言&#xff1a; 1.如何在vscode编写html代码在我的另一篇文章当中有详细教程&#xff0c;这是超链接。 2.很多小伙伴编写了html代码后&#xff0c;在vscode里面右键找不到如何去运行代码&…

NProgress的用法

最近&#xff0c;应该很多小伙伴都找到前端开发的工作了吧。怎么样&#xff1f;工作中的代码是不是比机构学的代码复杂很多倍&#xff1f; 比如说 router里面的路由钩子函数是不是比学习的时候复杂很多倍&#xff1f;还有vuex模块是不是会见到许许多多的文件夹&#xff0c;每个…

vue长列表优化之虚拟列表实现

vue长列表优化之虚拟列表实现 应用场景:后台一次性发送上千条或更多数据给前台 场景模拟:用户发起一个请求,后台发送了10w条数据 使用虚拟列表之前:前台需要生成10w个dom节点用来渲染页面 使用虚拟列表之后:前台只需要生成少量dom节点(dom节点数量取决于前端视图需要展示的…

html中常见标签及其用法归纳大全

html零基础必看——htmlHTML常见标签大全 第二章&#xff1a;html常见标签前言一、常见标签&#xff08;一&#xff09;1、body标签2、div盒子标签3、p文本段落标签4、h1~h6 标题标签5、b标签和strong标签&#xff08;文字加粗标签&#xff09;6、span文字包裹标签7、br换行标签…

大二学生web期末大作业 在线电影网站 HTML+CSS+JS

&#x1f329;️ 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f482; 作者主页: 【进入主页—&#x1f680;获取更多源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;HTML5网页期末作业 (1000套…

ES6展开运算符“...”

● ES6新增了一个运算符“...”&#xff0c;叫做展开运算符 ● 作用是把数组或者对象内容展开 &#xff08;1&#xff09;展开数组&#xff1a; ○ ES5方法&#xff1a;concat&#xff08;&#xff09; <script>let a [1,2,3]let b [4,5,6]//ES5的方法&#xff1a;c…

【百度地图】百度地图的使用方法 和 在vue中如何使用百度地图(超详细)

【百度地图】百度地图的使用方法 和 在vue中如何使用百度地图&#xff08;超详细&#xff09; 1- 介绍 百度地图功能强大&#xff0c;本篇文章只是对百度地图JavaScript API 进行一个介绍~ 官方网址 百度地图开放平台LBS&#xff1a;LocationBusinessServer 基于定义位置的商…

JS 连接MQTT的方法(mqtt.js的使用方法)

本文章是介绍 mqtt.js 的使用方法 一、说明 本文章使用的版本是 4.1.x &#xff0c;没用最新版的原因是 4.2.x 以上版本会报错&#xff0c;具体报错可以看我的另一篇文章&#xff0c;点击查看。使用的 4.1.x 版本地址&#xff1a;https://cdn.bootcdn.net/ajax/libs/mqtt/4.1…

若依 vue前端 动态设置路由path不同参数 在页面容器里打开新页面(新路由),面包屑和标签页标题根据参数动态改变,面包屑多级标题,侧边栏对应菜单亮起

前言 因为是在vue源码的基础上进行修改&#xff0c;所以&#xff0c;就没有复制代码在文章上&#xff0c;采取的是截图对比源码和我修改的代码片段。要麻烦你们自己手敲了。 先来看看效果&#xff1a; 场景&#xff1a;在费用配置列表中&#xff0c;点击每一项的配置&#x…

vue如何设置元素的显示隐藏

方法&#xff1a;可以使用v-if&#xff0c;也可以使用v-show指令。 v-if 指令&#xff0c;通过动态的向DOM树内添加或者删除DOM元素的方式来显示或隐藏元素&#xff1b; v-show 指令&#xff0c;通过设置DOM元素的display样式属性来控制显隐。 区别&#xff1a; v-if 会直接删除…

手把手教你在 Vue3 中自定义指令

TienChin 项目前端是 Vue3&#xff0c;前端有这样的一个需求&#xff1a;有一些前端页面上的按钮要根据用户的权限来决定是否展示出来&#xff0c;如果用户具备相应的权限&#xff0c;那么就展示对应的按钮&#xff1b;如果用户不具备对应的权限&#xff0c;那么按钮就隐藏起来…

微信小程序:用户微信登录流程(附:流程图+源码)

目录 前言 一、微信小程序是什么&#xff1f; 二、业务流程 1、使用微信小程序登录的wx.login()方法 2、后端使用登录凭证换取session_key和openid 3、前端处理session_key、openid和token 尾言 前言 随着微信小程序大规模的铺开和宣传&#xff0c;在生活中随处可见微信小程序…

vue2常见面试题

文章目录1、vue 修改数据页面不重新渲染数组/对象的响应式 &#xff0c;vue 里面是怎么处理的&#xff1f;2、生命周期Vue 生命周期都有哪些&#xff1f;父子组件生命周期执行顺序3、watch 和 computed 的区别4、组件通信&#xff08;组件间传值&#xff09;5、$nextTick6、修饰…