【NodeJS】NodeJS+mongoDB在线版开发简单RestfulAPI (四):状态码的使用
本项目旨在学习如何快速使用 nodejs 开发后端api,并为以后开展其他项目的开启提供简易的后端模版。(非后端工程师)
由于文档是代码写完之后,为了记录项目中需要注意的技术点,因此文档的叙述方式并非开发顺序(并非循序渐进的教学文档)。建议配合项目源码node-mongodb-template 。
【NodeJS】NodeJS+mongoDB在线版开发简单RestfulAPI (一):项目简介及安装依赖
【NodeJS】NodeJS+mongoDB在线版开发简单RestfulAPI (二):项目文件夹架构及路由的设置
【NodeJS】NodeJS+mongoDB在线版开发简单RestfulAPI (三):Cors的设置及.env文件的设置
【NodeJS】NodeJS+mongoDB在线版开发简单RestfulAPI (四):状态码的使用
【NodeJS】NodeJS+mongoDB在线版开发简单RestfulAPI (五):POST上传文件的设置
【NodeJS】NodeJS+mongoDB在线版开发简单RestfulAPI (六):token的设置
【NodeJS】NodeJS+mongoDB在线版开发简单RestfulAPI (七):MongoDB的设置
【NodeJS】NodeJS+mongoDB在线版开发简单RestfulAPI (八):API说明(暂时完结,后续考虑将在线版mongoDB变为本地版)
状态码的使用
http请求的响应结果会通过状态码来反应和归类。
分类
响应状态码通常分为5类:
100-199:信息响应
200-299:成功响应
-
200: 请求成功,通常用在Get、Delete等请求;
-
201: 创建成功,通常用在Post请求;
300-399:重定向
400-499:客户端错误
-
400: 客户端错误,如语法错误、无效信息等,服务端不会处理请求;
-
401: 身份权限错误;
-
403: 客户端未经授权;
-
404: 服务器无法找到请求内容;
-
409: 请求与当前服务器状态冲突;
500-599:服务端错误
500: 服务器遇到未知错误;
定义状态码的code
res.status(200).json({...}});
//GET 200
//catch err 500
const get_orders_all =(req,res,next) => {Order.find().select('product quantity _id').populate('product','name price').exec().then(docs=>{const response = {...};res.status(200).json(response); }).catch(err=>{res.status(500).json({error:err});});
};
//POST
//创建订单
//创建前先查找是否存在对应产品
//没有返回 404
//创建成功 返回 201
//catch err 500
const create_order = (req,res,next) => {Product.findById(req.body.productId).then(product=>{if(!product){return product;}const order = new Order(...);return order.save() }).then(result=>{if(!result){res.status(404).json({message: 'Product not found'});}else{const response = {...};res.status(201).json(response); }}) .catch(err=>{res.status(500).json({error:err});});
};
//注册账号 POST
//注册之前查找是否存在邮箱
//存在 409
//不存在,允许创建
//密码加密,加密失败 500
//成功注册 201
//catch err 500
const user_signup = (req,res,next) => {User.findOne({email: req.body.email}).exec().then(user=>{if(user){res.status(409).json({message:"Mail exists"});}else{bcrypt.hash(req.body.password,10,(err,hash) => {if(err){return res.status(500).json({err:err})}else{const user = new User(...);user.save().then(result=>{ res.status(201).json(...);}).catch(err=>{res.status(500).json({error:err});});}})}}).catch(err=>{res.status(500).json({error:err});});
};
//用户登录 GET
//查找账户是否存在
//不存在 401
//校验密码,密码不对 401
//匹配 200
const user_login = (req,res,next) => {User.find({email: req.body.email}).exec().then(user=>{if(user.length<1){res.status(401).json({message:"Auth Failed"});}else{bcrypt.compare(req.body.password,user[0].password,(err,result) => {if(err){res.status(401).json({message:"Auth Failed"});}if(result){const token = jwt.sign({email:user[0].email,userId:user[0]._id},process.env.JWT_KEY,{expiresIn:"1h",});res.status(200).json({message:"Auth successfully",token:token,request:{type: 'POST',url: 'http://localhost:3000/user/signup',body:{email:"string",password:"string"}}});}else{res.status(401).json({message:"Auth Failed"});}})}}).catch(err=>{res.status(500).json({error:err});});
};
其他响应信息的定义
通常返回状态码的同时,还要返回一些有用信息。
如请求所有产品的信息,那么就至少需要
- 范围一个产品数组,每个元素中包括产品的必要信息;
- 产品的个数;
- (可选)单个产品查询请求的url帮助
这里给出模版公参考
//GET ALL请求
const response = {count:docs.length;products:docs.map(_=>{return {name:..,price:..,_id:id,request:{type:'GET',url: 'http://localhost:3000/products/'+_._id}};});
};
//GET ONE请求
const response = {result: doc,request:{type: 'GET',url: 'http://localhost:3000/orders/'}
}
//POST请求
const response = {message:'Create order successfully' ,createdOrder: {result: {product:result.product,quantity:result.quantity,_id:result._id},request:{type: 'GET',url: 'http://localhost:3000/orders/'+result._id}}
}
//DELETE ONE删除
const response = {message:"Order deleted successfully",request:{type: 'POST',url: 'http://localhost:3000/orders/',body:{productId:"string",quantity:"Number"}}
}
//PATCH ONE修改
const response = {message:"Product updated successfully",request:{type: 'GET',url: 'http://localhost:3000/products/'+id}
}
相关文章:
【NodeJS】NodeJS+mongoDB在线版开发简单RestfulAPI (四):状态码的使用
本项目旨在学习如何快速使用 nodejs 开发后端api,并为以后开展其他项目的开启提供简易的后端模版。(非后端工程师) 由于文档是代码写完之后,为了记录项目中需要注意的技术点,因此文档的叙述方式并非开发顺序࿰…...
springboot061基于B2B平台的医疗病历交互系统(论文+源码)_kaic
摘 要 进入21世纪,计算机技术迅速向着网络化的、集成化方向发展。传统的单机版应用软件正在逐渐退出舞台,取而代之的是支持网络、支持多种数据信息的新一代网络版应用软件,形成了信息化的社会。信息化社会的形成和微电子技术日新月异的发展&…...
基于FFT + CNN -Transformer时域、频域特征融合的电能质量扰动识别模型
往期精彩内容: Python-电能质量扰动信号数据介绍与分类-CSDN博客 Python电能质量扰动信号分类(一)基于LSTM模型的一维信号分类-CSDN博客 Python电能质量扰动信号分类(二)基于CNN模型的一维信号分类-CSDN博客 Python电能质量扰动信号分类(三)基于Transformer的一…...
JAVA开发环境:IntelliJ IDEA、Java JDK、Maven 安装配置
一、安装IntelliJ IDEA 准备安装包 通过百度网盘分享的文件:idea2023.2U**.zip 链接:https://pan.baidu.com/s/1NB04A-jMXhZKsewYshGt-Q 提取码:oeft 安装 IntelliJ IDEA (1)、解压,安装文件如下&#…...
鸿蒙软件开发中常见的如何快速自动生成二维码?QRCode组件
QRCode 用于显示单个二维码的组件。 说明: 该组件从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 二维码组件的像素点数量与内容有关,当组件尺寸过小时,可能出现无法展示内容的情况&…...
鸿蒙HarmonyOS NEXT 5.0开发(2)—— ArkUI布局组件
文章目录 布局Column:从上往下的布局Row:从左往右的布局Stack:堆叠布局Flex:自动换行或列 组件Swiper各种选择组件 华为官方教程B站视频教程 布局 主轴和交叉轴的概念: 对于Column布局而言,主轴是垂直方…...
【openGauss】OPENGAUSS/POSTGRESQL 中float类型到int类型的隐式转换
下面这条sql在oracle和POSTGRESQL/OPENGAUSS中的查询结果不一致 select cast(cast(0.5 as float) as integer);在oracle中返回1,在openGauss中返回0,咋一看好像是openGauss中使用了截断的方式,但是如果执行 select cast(cast(1.5 as float) as integ…...
Docker:安装 Syslog-ng 的技术指南
1、简述 Syslog-ng 是一种流行的日志管理工具,能够集中处理和分析日志。通过 Docker 安装 Syslog-ng 可以简化部署和管理过程。本文将介绍如何使用 Docker 安装 Syslog-ng,并提供一个 Java 示例来展示如何将日志发送到 Syslog-ng。 2、安装 2.1 创建…...
即插即用的3D神经元注意算法!
本文所涉及所有资源均在 传知代码平台 可获取。 目录 3D神经元注意力:为每一个神经元分配权重!(算法) 一、概述 二、研究背景 三、主要贡献 四、模型结构和代码 五、数据集介绍 六、性能展示 六、复现过程 七、运行过程 SimAM总结…...
FPGA 蜂鸣器 音乐播放器
点击: FPGA 蜂鸣器音乐播放器 基于FPGA的beep音乐播放器设计 FPGA(Field Programmable Gate Array)蜂鸣器音乐播放器是一个将FPGA编程用于控制蜂鸣器播放音乐的设备。下面是一个简单的实现步骤和思路: 一、硬件准备 FPGA开发板…...
前端-基础CSS总结常用
1.书写位置:title 标签下方添加 style 双标签,style 标签里面书写 CSS 代码。 <title>CSS 初体验</title> <style>/* 选择器 { } */p {/* CSS 属性 */color: red;} </style><p>体验 CSS</p> <link rel="stylesheet" href=…...
Coppelia Sim (v-REP)仿真 机器人3D相机手眼标定与实时视觉追踪 (一)
coppelia sim[V-REP]仿真实现 机器人于3D相机手眼标定与实时视觉追踪 一 标定板的制作生成标定的PDF文件PDF转为图像格式图像加载到仿真中 二 仿真场景设置加载机器人加载的控制dummy 
1总体架构 智能小区门禁系统以STM32单片机和WiFi技术为核心,STM32单片机作为主控单元,通过WiFi模块实现与手机APP的连接,构建整个门禁系统。系统硬件包括RFID模块、指纹识别模块、显示屏、按键以及继电器。通过RFID绑定IC卡、APP面部识别、指…...
stm32F103 实现呼吸灯效果
目录 硬件连接 软件实现步骤 初始化系统时钟。 配置 GPIO 引脚。 配置定时器以生成 PWM 信号。 在主循环中调整 PWM 占空比以实现呼吸效果。 示例代码 1. 初始化系统时钟 2. 配置 GPIO 引脚 3. 配置定时器以生成 PWM 信号 4. 在主循环中调整 PWM 占空比以实现呼吸效…...
SAP 为 Copilot Joule 增添协作功能
在最新的SAP TechEd大会上,SAP发布了一系列创新功能,旨在扩展其AI平台Joule的能力,同时推出了其他工具,以提高企业效率并为开发人员提供更多支持。这些创新不仅将推动AI驱动的业务转型,还将加强数据的利用和简化开发流…...
Node.js 模块化
1. 介绍 1.1 什么是模块化与模块 ? 将一个复杂的程序文件依据一定规则(规范)拆分成多个文件的过程称之为 模块化其中拆分出的 每个文件就是一个模块 ,模块的内部数据是私有的,不过模块可以暴露内部数据以便其他模块使用 1.2 什…...
【部署篇】RabbitMq-03集群模式部署
一、准备主机 准备3台主机用于rabbitmq部署,文章中是在centos7上安装部署rabbitmq3.8通过文章中介绍的方式可以同样在centos8、centos9上部署,只需下载对应的版本进行相同的操作。 主机IP角色说明192.168.128.31种子节点192.168.128.32普通节点192.16…...
【硬啃Dash-Fastapi-Admin】03-requirements-pg.txt 速览
文章目录 dash2.18.1 纯Python的Web应用框架Python Dash库的功能介绍和用法示例功能介绍用法示例 Flask-Compress1.15 Flask响应数据的压缩功能介绍用法示例注意事项 feffery-antd-charts0.1.0rc5 数据可视化组件库功能介绍用法示例 feffery-antd-components0.3.8 Dash 第三方组…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...
RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill
视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...
Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
【PX4飞控】mavros gps相关话题分析,经纬度海拔获取方法,卫星数锁定状态获取方法
使用 ROS1-Noetic 和 mavros v1.20.1, 携带经纬度海拔的话题主要有三个: /mavros/global_position/raw/fix/mavros/gpsstatus/gps1/raw/mavros/global_position/global 查看 mavros 源码,来分析他们的发布过程。发现前两个话题都对应了同一…...
智警杯备赛--excel模块
数据透视与图表制作 创建步骤 创建 1.在Excel的插入或者数据标签页下找到数据透视表的按钮 2.将数据放进“请选择单元格区域“中,点击确定 这是最终结果,但是由于环境启不了,这里用的是自己的excel,真实的环境中的excel根据实训…...
