【Nodejs】基于Promise异步处理的博客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');

    //获取path
    const url=req.url;
    req.path=url.split('?')[0];

    //解析query
    req.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
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue3中pdf打印问题处理

1 get请求参数问题 之前的请求是post得不到参数,今天发现的问题很奇怪,从前端进入网关,网关居然得不到参数。 前端代码 const print () > {let linkUrlStr proxy.$tool.getUrlStr(proxy.$api.invOrder.psiInvOrder.printSalOutstock,{a…

Nougat:科学文档的OCR 使用记录

https://github.com/facebookresearch/nougat python环境需要在3.8以上 安装:pip install nougat-ocr 模型默认下载地址:/home/****/.cache/torch/hub/nougat-0.1.0-small 环境安装好之后默认使用cpu UserWarning: CUDA initialization: The NVIDIA dr…

基于决策树、随机森林和层次聚类对帕尔默企鹅数据分析

作者:i阿极 作者简介:数据分析领域优质创作者、多项比赛获奖者:博主个人首页 😊😊😊如果觉得文章不错或能帮助到你学习,可以点赞👍收藏📁评论📒关注哦&#x…

一文搞懂SiLM824x系列SiLM8243BBCL-DG 双通道死区可编程隔离驱动 主要特性与应用 让技术变得更有价值

SiLM824x系列SiLM8243BBCL-DG是一款具有不同配置的隔离双通道门极驱动器。SiLM8243BBCL-DG配置为高、低边驱动,SiLM8243BBCL-DG可提供4A的输出源电流和6A的灌电流能力,并且其驱动输出电压可以支持到33V。支持死区可编程,通过调整DT脚外部的电…

AI:106-基于卷积神经网络的遥感图像地物分类

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的关键代码,详细讲解供…

Sonarqube安装(Docker)

一,拉取相关镜像并运行 # 拉取sonarqube镜像 docker pull sonarqube:9.1.0-community在运行之前要提前安装postgres并允许,新建数据库名为sonar的数据库 Docker安装postgres教程 docker run -d --name sonarqube --restartalways \ -p 19000:9000 \ …

自制数据库空洞率清理工具-C版-02-EasyClean-V1.1(支持南大通用数据库Gbase8a)

一、环境信息 名称值CPUIntel(R) Core(TM) i5-1035G1 CPU 1.00GHz操作系统CentOS Linux release 7.9.2009 (Core)内存3G逻辑核数2Gbase8a版本8.6.2-R43.34.27468a27EasyClean版本V1.1 二、简述 工作和兴趣相结合的产物,既能更好的完成工作,也能看看自…

速学python·变量和类型

变量是什么 变量是在计算复杂程序过程中,用于保存中间结果的东西,这个东西一般是可变的量,也就是变量。 例如: 计算方差 1.计算平均值 2.计算每个数字与平均值的差值再平方 3.相加每一项平方值 4.除项数 Average (77.588.599.510…

公有云基本概念

1、租户和用户的关系 (1)租户是在华为云上注册的一个账号,登录之后,这个账号可以认为是一个“租户”。 (2)租户默认角色是一个“企业管理员”角色。拥有华为云上所有可以使用的功能。 (3&…

C#:如何产生一个临时文件

在我们实际编程中,经常有将内容写到一个临时文件的需要。 比如:将网络上的图片下载下来,获取到图片的一些信息。 代码如下,看结果可知: 临时文件都是保存在系统临时文件夹的目录下,临时文件的扩展名统一…

机器学习(四) -- 模型评估(1)

系列文章目录 机器学习(一) -- 概述 机器学习(二) -- 数据预处理(1-3) 机器学习(三) -- 特征工程(1-2) 机器学习(四) -- 模型评估…

5.vue学习笔记(数组变化的侦测+计算属性+Class绑定)

文章目录 1.数组变化的侦测1.1.变更方法1.2.替换一个数组 2.计算属性计算属性缓存vs方法 3.Class绑定3.1.绑定对象3.2.多个对象的绑定形式3.3.绑定数组3.4.数组与对象 1.数组变化的侦测 1.1.变更方法 vue能够侦听响应式数组的变更方法,并在它们被调用时出发相关的…

在centos7部署redis7

一、目标 在centos7.9上部署安装redis-7.2.3 二、步骤 官网 https://redis.io/download/ 1、下载合适版本的redis wget https://github.com/redis/redis/archive/7.2.3.tar.gz --no-check-certificate 如果这个链接失效,自行去官网找个合适的版本 2、安装redi…

【CFP-专栏2】计算机类SCI优质期刊汇总(含IEEE/Top)

一、计算机区块链类SCI-IEEE 【期刊概况】IF:4.0-5.0, JCR2区,中科院2区; 【大类学科】计算机科学; 【检索情况】SCI在检; 【录用周期】3-5个月左右录用; 【截稿时间】12.31截稿; 【接收领域】区块链…

vue的小入门

vue的快速上手 Vue概念 是一个用于构建用户界面的渐进式框架优点:大大提高开发效率缺点:需要理解记忆规则 创建Vue实例 步骤: 准备容器引包创建Vue实例new Vue()指定配置项el data>渲染数据 el指定挂载点,选择器指定控制…

【REST2SQL】03 GO读取JSON文件

REST2SQL需要一些配置信息,用JSON文件保存,比如config.json 1 创建config.json配置文件 {"hostPort":"localhost:5217","connString":"oracle://blma:5217127.0.0.1:1521/CQYH","_oracle":"ora…

linux centos使用rz、sz命令上传下载文件

一般情况下,我们会使用终端软件,如 XShell、SecureCRT 或 FinalShell 来连接远程服务器后,使用 rz 命令上传本地文件到远程服务器,再解压发版上线。 一、安转使用 系统:Linux CentOS 7 安装 rz 和 sz 命令 yum -y ins…

Python 学习路线:介绍、基础语法、数据结构、算法、高级主题、框架及异步编程详解

Python 介绍 Python 是一种 高级 的、解释型 的、通用 的编程语言。其设计哲学强调代码的可读性,使用显著的缩进。Python 是 动态类型 和 垃圾收集 的。 基本语法 设置 Python 环境并开始基础知识。 变量 变量用于存储在计算机程序中引用和操作的信息。它们还提…

leetcode第206题反转链表❤

一:题目: 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1: 输入:head [1,2,3,4,5] 输出:[5,4,3,2,1] 题目链接:力扣(LeetCode)官网…

友思特分享 | CamSim相机模拟器:极大加速图像处理开发与验证过程

来源:友思特 机器视觉与光电 友思特分享 | CamSim相机模拟器:极大加速图像处理开发与验证过程 原文链接:https://mp.weixin.qq.com/s/IED7Y6R8WE4HmnTiRY8lvg 欢迎关注虹科,为您提供最新资讯! 随着图像处理技术的不断…