【Nodejs】基于node http模块的博客demo代码实现

目录

package.json

www.js

db.js

app.js

routes/blog.js

controllers/blog.js

mysql.js

responseModel.js


无开发,不安全。

这个demo项目实现了用Promise异步处理http的GET和POST请求,通过mysql的api实现了博客增删改查功能,但因没有写登录身份认证功能,所以限制具体博客增删时的权限就用了假数据。

下面直接贴出源码:

package.json

{"name": "nodetest","version": "1.0.0","description": "","main": "bin/www.js","scripts": {"dev": "nodemon bin/www.js"},"keywords": [],"author": "","license": "ISC","devDependencies": {"nodemon": "^3.0.2"},"dependencies": {"mysql": "^2.18.1"}
}

这里用的是nodemon监视文件系统的更改,并自动重启 Node.js 应用程序

运行:npm run dev

www.js

//创建服务器
const http=require('http');
const serverHandler=require('../app');
const PORT =5000;
const server=http.createServer(serverHandler);server.listen(PORT,()=>
{console.log('server running at port 5000...');
})

db.js

let MYSQL_CONFIG={};MYSQL_CONFIG={host:'localhost',user:'root',password:'root',port:3306,database:'nodeblog'
}module.exports={MYSQL_CONFIG
}

app.js

//业务逻辑代码
const querystring = require('querystring');
const handleBlogRoute=require('./src/routes/blog');//处理POST数据
const getPostData=(req)=>{const promise=new Promise((resolve,reject)=>{if(req.method!=='POST'){resolve({});return;}if(req.headers['content-type']!=='application/json'){resolve({});return;}let postData='';req.on('data',(chunk)=>{postData+=chunk.toString();});req.on('end',()=>{if(!postData){resolve({});return;}resolve(JSON.parse(postData));});});return promise;
}
const serverHandler=(req,res)=>
{//设置相应格式res.setHeader('Content-Type','application/json');//获取pathconst url=req.url;req.path=url.split('?')[0];//解析queryreq.query=querystring.parse(url.split('?')[1]);//处理POST数据getPostData(req).then((postData)=>{req.body=postData;//博客相关的路由const blogDataPromise=handleBlogRoute(req,res);if (blogDataPromise){blogDataPromise.then((blogData)=>{res.end(JSON.stringify(blogData));});return;}//未匹配到任何路由res.writeHead(404,{'Content-Type':'text/plain'});res.write('404 Not Found');res.end();});}module.exports=serverHandler;

routes/blog.js

//处理博客相关的路由
const {SuccessModel, ErrorModel}=require('../model/responseModel');
const {getList,getDetail,createNewBlog,updateBlog,deleteBlog} = require('../controllers/blog');const handleBlogRoute=(req,res)=>
{const method=req.method;const blogData=req.body;const id=req.query.id;if(method==='GET' && req.path==='/api/blog/list'){const author=req.query.author||'';const keyword=req.query.keyword||'';const listDataPromise=getList(author,keyword);return listDataPromise.then((listData)=>{return new SuccessModel(listData);});}if(method==='GET' && req.path==='/api/blog/detail'){const detailDataPromise=getDetail(id);return detailDataPromise.then(detailData=>{return new SuccessModel(detailData);})}if(method==='POST' && req.path==='/api/blog/new'){const author='Hacker';req.body.author=author;const newBlogDataPromise=createNewBlog(blogData);return newBlogDataPromise.then(newBlogData=>{return new SuccessModel(newBlogData);});}if(method==='POST' && req.path==='/api/blog/update'){const updatedBlogDataPromise=updateBlog(id,blogData);return updatedBlogDataPromise.then((updatedBlogData)=>{if (updatedBlogData){return new SuccessModel('更新博客成功!');}else{return new ErrorModel('更新博客失败...');}});}if(method==='POST' && req.path==='/api/blog/delete'){const author='Hacker';const deleteBlogDataPromise=deleteBlog(id,author);return deleteBlogDataPromise.then((deleteBlogData)=>{if (deleteBlogData){return  new SuccessModel('删除博客成功!');}else{return new ErrorModel('删除博客失败...');}});}}module.exports=handleBlogRoute;

controllers/blog.js

const {execSQL}=require('../db/mysql');//获取博客列表
const getList=(author,keyword)=>{let sql=`select * from blogs where`;if(author){sql+=` author='${author}' `;}if(keyword){sql+=`and title like '%${keyword}%'`;}return execSQL(sql);
}//获取博客详情
const getDetail=(id)=>{const sql=`select * from blogs where id='${id}'`;return execSQL(sql).then(rows=>{console.log('rows',rows);return rows[0];});
}//创建新的博客
const createNewBlog=(blogData={})=>{const title=blogData.title;const content=blogData.content;const author=blogData.author;const createdAt=Date.now();const sql=`insert into blogs (title,content,author,createdAt) values ('${title}','${content}','${author}',${createdAt})`;return execSQL(sql).then(insertedResult=>{console.log('insertedResult',insertedResult);return {id:insertedResult.insertId}});}const updateBlog=(id,blogData={})=>{const title=blogData.title;const content=blogData.title;const sql=`update blogs set title='${title}', content='${content}' where id=${id}`;return execSQL(sql).then(updateResult=>{console.log('updateResult',updateResult);if(updateResult.affectedRows>0){return true;}return false;})
}const deleteBlog=(id,author)=>{const sql=`delete from blogs where id=${id} and author='${author}'`;return execSQL(sql).then(deleteResult=>{console.log('deleteResult',deleteResult);if(deleteResult.affectedRows>0){return true;}return false;})
}
module.exports={getList,getDetail,createNewBlog,updateBlog,deleteBlog
}

mysql.js

const mysql=require('mysql');
const { MYSQL_CONFIG } = require('../config/db');const connection=mysql.createConnection( MYSQL_CONFIG);//开始连接
connection.connect();//执行sql语句
function execSQL(sql){const promise=new Promise((resolve,reject)=>{connection.query(sql,(err,result)=>{if(err){reject(err);return;}resolve(result);})
})return promise;
}module.exports={execSQL
}

responseModel.js

class BaseModel{constructor(data,message){if(typeof data==='string'){this.message=data;data=null;message=null;}if(data){this.data=data;}if(message){this.message=message;}}
}class SuccessModel extends BaseModel{constructor(data,message){super(data,message);this.errno=0;}
}class ErrorModel extends BaseModel{constructor(data,message){super(data,message);this.errno=-1;}
}module.exports = {SuccessModel,ErrorModel
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python 简单爬虫程序及其工作原理

前言 网络中包含大量的数据,这些数据对于我们来说是非常有价值的,因此编写一个爬虫程序,自动从网页中获取所需的数据,对于信息收集和分析是非常有帮助的。Python 是一种高效而灵活的编程语言,它提供了强大的库和框架来…

istio 限流:本地限流+全局限流

istio 限流在官网的位置是 任务->策略执行->使用 Envoy 启用速率限制 istio 限流基于数据面 Envoy 开发,Envoy 支持两个类型限流,分别是本地限流和全局限流(本地限流和全局限流可以一起使用) 开始之前 安装 istio部署 boo…

【面试高频算法解析】算法练习3 双指针

前言 本专栏旨在通过分类学习算法,使您能够牢固掌握不同算法的理论要点。通过策略性地练习精选的经典题目,帮助您深度理解每种算法,避免出现刷了很多算法题,还是一知半解的状态 专栏导航 二分查找回溯双指针滑动窗口深度优先搜索…

八、QLayout 用户基本资料修改(Qt5 GUI系列)

目录 一、设计需求 二、实现代码 三、代码解析 四、总结 一、设计需求 在很多应用程序中会有用户注册或用户编辑信息等界面。本文就设计一个用户信息编辑界面。要求包含用户名、姓名、性别、部门、年龄、头像、个人说明等信息。 二、实现代码 #ifndef DIALOG_H #define D…

STM32和ESP8266的WiFi模块控制与数据传输

基于STM32和ESP8266 WiFi模块的控制与数据传输是一种常见的嵌入式系统应用。在这种应用中,STM32作为主控制器负责控制和与外部传感器交互,而ESP8266 WiFi模块则用于实现无线通信和数据传输。本文将介绍如何在STM32上控制ESP8266模块,建立WiFi…

Ubuntu上使用node搭建本地静态http服务器

1.搭建步骤 1.安装Node.js。首先确保你的Ubuntu系统已经安装了Node.js。如果没有安装,可以通过以下命令进行安装: sudo apt-get update sudo apt-get install nodejs #安装nodejs 2.安装npm。npm是Node.js的包管理器,一般会随着Node.js一…

用开源大语言模型开发的智能对话机器人初版原型验证

用开源大语言模型开发的智能对话机器人初版原型验证 0. 背景1. 初版检证效果展示2. 验证效果总结 0. 背景 同事要想做一个智能对话机器人,特别的需求有有些几点, 通过预置提示词(包括确认事项),让大语言模型用会话式…

react+AntDesign 之 pc端项目案例

1.环境搭建以及初始化目录 CRA是一个底层基于webpack快速创建React项目的脚手架工具 # 使用npx创建项目 npx create-react-app react-jike# 进入到项 cd react-jike# 启动项目 npm start2.安装SCSS SASS 是一种预编译的 CSS,支持一些比较高级的语法,…

如何搭建中后台管理系统

vue3 TS vite 搭建中后台管理系统 前言1、搭建步骤及方法2、集成多种插件功能,实现中后台按需使用3、新手学TS如何快速进入状态、定义TS类型4、layout搭建四款常见风格6、大屏搭建效果5、vue3Ts运营管理系统总结: 前言 要成功,先发疯&…

Python从入门到网络爬虫(面向对象详解)

前言 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的。本章节我们将详细介绍Python的面向对象编程。如果你以前没有接触过面向对象的编程语言,那你可能需要先了解一些面向对象语言的一些基本…

第二百四十六回

我们在上一章回中介绍了"修改页面导航中遇到的问题"沉浸式状态样相关的内容,本章回中将介绍如何修改Avatar的大小.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在正常使用CirCleAvatar组件时可以通过该组件的radius属性来修改它的…

多线程基础入门【Linux之旅】——上篇【线程控制,线程互斥,线程安全】

目录 前文 回望页表 一,什么是线程 二,使用 pthread_create (线程创建) 三,线程控制 1 ,线程共享进程数据,但也拥有自己的一部分数据: 2, 线程 VS 进程优点 3,…