基于Vue3和Node.js的完整增删改查项目实现教程:从后端封装到前端调用

news/2024/9/17 15:44:53/ 标签: node.js, 前端

在 Node.js 中封装一个增删改查(CRUD)接口,并在 Vue 3 前端调用这些接口。整个过程包括后端 API 的创建和前端的调用。

一、安装 Node.js 和 Express 脚手架

1. 安装 Node.js

首先,你需要安装 Node.js。你可以通过以下步骤进行安装:

  1. 访问 Node.js 官网。

  2. 根据你的操作系统选择适合的安装包,并安装。

在安装完成后,你可以通过以下命令检查是否安装成功:

node -v

如果成功安装,终端会显示 Node.js 的版本号。

2. 使用 Express 脚手架创建项目

接下来,我们将使用 Express 脚手架创建一个新的项目。

npx express-generator my-express-app
cd my-express-app
npm install

这会创建一个名为 my-express-app 的项目,并安装所有依赖。

二、搭建 MongoDB 数据库

1. 安装 MongoDB

首先,你需要安装 MongoDB。你可以通过以下步骤进行安装:

  1. 访问 MongoDB 官网。

  2. 根据你的操作系统选择适合的版本,并安装。

安装完成后,启动 MongoDB:

mongod --dbpath <your-data-path>

2. 连接 MongoDB 与 Node.js

my-express-app 目录中,我们需要安装 mongoose 以便与 MongoDB 交互:

npm install mongoose

接下来,在项目的 app.js 中添加以下代码,连接到 MongoDB:

const mongoose = require('mongoose');mongoose.connect('mongodb://localhost:27017/mydatabase', {useNewUrlParser: true,useUnifiedTopology: true,
});mongoose.connection.on('connected', () => {console.log('Connected to MongoDB');
});mongoose.connection.on('error', (err) => {console.log('Failed to connect to MongoDB', err);
});

三、封装 CRUD 操作

1. 创建 Mongoose 模型

在项目的 models 目录下创建一个 Item.js 文件,用于定义数据模型:

const mongoose = require('mongoose');const itemSchema = new mongoose.Schema({name: {type: String,required: true,},quantity: {type: Number,required: true,},
});module.exports = mongoose.model('Item', itemSchema);

2. 封装 CRUD 操作

routes 目录下创建一个 items.js 文件,用于处理增删改查请求:

const express = require('express');
const router = express.Router();
const Item = require('../models/Item');// Create an item
router.post('/items', async (req, res) => {try {const newItem = new Item(req.body);const savedItem = await newItem.save();res.status(201).json(savedItem);} catch (error) {res.status(400).json({ message: error.message });}
});// Get all items
router.get('/items', async (req, res) => {try {const items = await Item.find();res.json(items);} catch (error) {res.status(500).json({ message: error.message });}
});// Update an item
router.put('/items/:id', async (req, res) => {try {const updatedItem = await Item.findByIdAndUpdate(req.params.id, req.body, { new: true });res.json(updatedItem);} catch (error) {res.status(400).json({ message: error.message });}
});// Delete an item
router.delete('/items/:id', async (req, res) => {try {await Item.findByIdAndDelete(req.params.id);res.json({ message: 'Item deleted' });} catch (error) {res.status(500).json({ message: error.message });}
});module.exports = router;

然后在 app.js 中引入并使用这个路由:

const itemsRouter = require('./routes/items');
app.use('/api', itemsRouter);

四、前端:使用 Vue 3 实现接口调用

1. 创建 Vue 3 项目

首先,使用 Vue CLI 创建一个新的 Vue 3 项目:

npm install -g @vue/cli
vue create my-vue-app
cd my-vue-app

2. 创建 API 服务文件

src 目录下创建一个 api.js 文件,用于封装 API 请求:

import axios from 'axios';const apiClient = axios.create({baseURL: 'http://localhost:3000/api',headers: {'Content-Type': 'application/json',},
});export default {getItems() {return apiClient.get('/items');},createItem(item) {return apiClient.post('/items', item);},updateItem(id, item) {return apiClient.put(`/items/${id}`, item);},deleteItem(id) {return apiClient.delete(`/items/${id}`);},
};

3. 使用 setup 语法编写 Vue 组件

src/components 目录下创建一个 ItemList.vue 组件,用于展示和操作数据:

<template><div><h1>Item List</h1><ul><li v-for="item in items" :key="item._id">{{ item.name }} - {{ item.quantity }}<button @click="deleteItem(item._id)">Delete</button><button @click="editItem(item)">Edit</button></li></ul><div><input v-model="newItem.name" placeholder="Name" /><input v-model="newItem.quantity" type="number" placeholder="Quantity" /><button @click="addItem">Add Item</button></div></div>
</template><script setup>
import { ref, onMounted } from 'vue';
import api from '@/api';const items = ref([]);
const newItem = ref({name: '',quantity: null,
});const fetchItems = async () => {const response = await api.getItems();items.value = response.data;
};const addItem = async () => {const response = await api.createItem(newItem.value);items.value.push(response.data);newItem.value.name = '';newItem.value.quantity = null;
};const deleteItem = async (id) => {await api.deleteItem(id);items.value = items.value.filter(item => item._id !== id);
};const editItem = (item) => {newItem.value = { ...item };
};onMounted(() => {fetchItems();
});
</script>

4. 在 App.vue 中使用 ItemList.vue

修改 App.vue 来包含 ItemList.vue 组件:

<template><div id="app"><ItemList /></div>
</template><script setup>
import ItemList from './components/ItemList.vue';
</script>

5. 运行项目

确保你在运行后端的同时,在 my-vue-app 目录下运行前端项目:

npm run serve

现在,你应该可以在浏览器中访问 Vue 3 应用,并执行增删改查操作,这些操作将与后端的 Node.js 和 MongoDB 进行交互。

五、总结

这篇教程涵盖了以下内容:

  1. 如何安装和配置 Node.js 和 Express。

  2. 使用 Mongoose 连接和操作 MongoDB。

  3. 如何封装 CRUD 操作并与前端 Vue 3 结合。

  4. 使用 Vue 3 的 setup 语法糖编写组件,并通过 Axios 调用后端 API。

标题可以是: 《基于 Vue 3 和 Express 的完整增删改查项目实现:从后端封装到前端调用》


http://www.ppmy.cn/news/1517132.html

相关文章

零基础入门转录组数据分析——预后模型之多因素cox模型

零基础入门转录组数据分析——预后模型之多因素cox模型 目录 零基础入门转录组数据分析——预后模型之多因素cox模型1. 预后模型和多因素cox模型基础知识2. 多因素cox预后模型&#xff08;Rstudio&#xff09;——代码实操2. 1 数据处理2. 2 构建多因素cox模型&#xff08;用输…

如何构建社区康养管理系统?实现老年人服务管理全攻略【Java SpringBoot】

✍✍计算机毕业编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java、…

【Go语言成长之路】多模块工作区入门

文章目录 【Go语言成长之路】多模块工作区入门前提条件一、创建一个模块二、创建工作空间三、创建第二个模块四、更多关于workspace 【Go语言成长之路】多模块工作区入门 ​ 多模块工作区(muti-module workspaces)可以使得开发者在多个模块中构建并且运行代码&#xff0c;相互…

在浏览器上使用transformers.js运行(WebGPU)RMBG-1.4进行抠图(背景移除)

在浏览器上使用transformers.js运行&#xff08;WebGPU&#xff09;RMBG-1.4进行抠图&#xff08;背景移除&#xff09; 说明&#xff1a; 首次发表日期&#xff1a;2024-08-28官方Github仓库地址&#xff1a; https://github.com/xenova/transformers.js/tree/main/examples…

《深入浅出WPF》读书笔记.8路由事件

《深入浅出WPF》读书笔记.8路由事件 背景 路由事件是直接响应事件的变种。直接响应事件&#xff0c;事件触发者和事件响应者必须显示订阅。而路由事件的触发者和事件响应者之间的没有显示订阅&#xff0c;事件触发后&#xff0c;事件响应者安装事件监听器&#xff0c;当事件传…

SpringBoot -在Axis2中,RPCServiceClient调用WebService

在 Axis2 中,RPCServiceClient 是一种用于调用 WebService 的客户端实现。下面是如何将它们 结合起来使用的一个示例: 步骤 1: 添加依赖 首先,在 pom.xml 文件中添加 Axis2 的相关依赖。 <dependencies><!-- 其他依赖 --><dependency><groupId>…

拓扑排序-

基本原理 就是存在一个入度为0的点和一个出度为0的点 然后图中所有点都是指向同一个方向&#xff1b; /* 拓扑序列&#xff1a; 特点&#xff1a;有向无环图 判断&#xff1a;判断所有的点是否入度为0 换句话 就是入度为0的点个数是否满点的总数 过程&#xff1a;建图、入度数…

2024HarmonyOS应用开发者高级认证最新整理题库和答案(已收录182道 )

更新截止2024-08-27,完整题库一共182道题,足够覆盖90%考题,如有新题和遗漏我会持续补充 所有题目的选项都是打乱顺序的,记答案不要记序号 完整题库请在我的网盘下载或查看在线文档 完整题库在线文档预览 单选(已收录102道) 1 . 以下哪个装饰器用来表示并发共享对象。(B) A. @…

通过Python绘制不同数据类型适合的可视化图表

在数据可视化中&#xff0c;对于描述数值变量与数值变量之间的关系常见的有散点图和热力图&#xff0c;以及描述数值变量与分类变量之间的关系常见的有条形图&#xff0c;饼图和折线图&#xff0c;可以通过使用Python的matplotlib和seaborn库来绘制图表进行可视化表达&#xff…

超详细!!!uniapp通过unipush全流程实现app消息推送

云风网 云风笔记 云风知识库 一、HBuilder新建APP项目 二、配置推送服务 1、登录Dcloud开发者中心开发者中心&#xff0c;查看我的应用 2、生成云端证书 3、创建平台信息 4、配置推送服务信息 这里需要关联服务空间&#xff0c;可以申请免费服务空间进行测试 三、代码配置 1…

Java笔试面试题AI答之线程(24)

文章目录 139. 简述为什么 wait(), notify()和 notifyAll()必须在同步方法或 者同步块中被调用&#xff1f;140. 简述为什么 Thread 类的 sleep()和 yield ()方法是静态的 &#xff1f;1. sleep() 方法2. yield() 方法总结 141. 简述同步方法和同步块&#xff0c;哪个是更好的选…

hydra密码爆破工具详细使用教程

Hydra是一个强大的密码爆破工具&#xff0c;可以用来测试网络系统的弱口令。下面是使用Hydra的基本教程&#xff1a; 1. 安装Hydra 可以从Hydra的官方网站&#xff08;https://github.com/vanhauser-thc/thc-hydra&#xff09;下载最新版本的Hydra&#xff0c;并按照安装说明进…

spring boot 配置监听多端口

如何实现Spring Boot配置监听多端口 1. 概述 在Spring Boot应用中&#xff0c;有时候需要监听多个端口&#xff0c;比如同时监听HTTP和HTTPS端口。本文将介绍如何实现在Spring Boot应用中配置监听多端口。 2. 流程表格 步骤 操作 1 添加依赖 2 创建多端口配置类 3 …

turtlebot 测试 Gazebo Harmonic ROS Jazzy

源码移植后理论上支持所有Gazebo和ROS版本&#xff0c;但花费时间较多。 只推荐学习Gazebo 经典版和Gazebo Harmonic以及之后版本。 在中间的过渡版本&#xff0c;不推荐学习。 Gazebo经典版包括Gazebo 7 Gazebo 9 Gazebo 11。 Gazebo Harmonic 和 ROS2 jazzy 安装和测试-CSDN博…

vue3+ts el-table 鼠标移动到某单元格内时就显示 tooltip

在Vue 3和Element Plus中&#xff0c;要在鼠标移动到表格某个单元格上时显示tooltip&#xff0c;可以使用el-tooltip组件&#xff0c;并结合表格的cell-mouse-enter和cell-mouse-leave事件。 <template> <el-table :data"tableData" cell-mouse-e…

深度学习-批量与动量【Datawhale X 李宏毅苹果书 AI夏令营】

实际工程中使用批量和动量可以对抗鞍点或局部最小值。 批量&#xff1a; 在计算梯度的时候不会用所有数据计算损失。类比我们考试复习时&#xff0c;一个单元一个单元的知识点输入&#xff0c;所有单元都输入就是一整个轮回。而这一个单元用深度学习的术语来说就是批量&#x…

CSRF 概念及防护机制

概述 CSRF&#xff08;Cross-Site Request Forgery&#xff09;&#xff0c;即跨站请求伪造&#xff0c;是一种网络攻击方式。在这种攻击中&#xff0c;恶意用户诱导受害者在不知情的情况下执行某些操作&#xff0c;通常是利用受害者已经登录的身份&#xff0c;向受害者信任的…

【精选】基于数据可视化的智慧社区内网平台

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

华为AC旁挂二层组网配置详解:从DHCP部署到无线业务配置,完成网络搭建

组网需求 AC组网方式&#xff1a;旁挂二层组网。 DHCP部署方式&#xff1a; AC作为DHCP服务器为AP分配IP地址。 防火墙作为DHCP服务器为STA分配IP地址。 业务数据转发方式&#xff1a;直接转发。 网络拓扑图 对于旁边路直接转发&#xff0c;优点就是数据流量不经过AC&…

决策树和随机森林介绍

hello大家好&#xff0c;俺是没事爱瞎捣鼓又分享欲爆棚的叶同学&#xff01;&#xff01;&#xff01;今天我来给大家介绍一下决策树与随机森林&#xff0c;说起随机森林俺还有件很久远的丑事&#xff0c;之前有关课的结课作业就是用模型训练并预测&#xff0c;那时我比较天真&…