express学会CRUD

简介: express学会CRUD

使用express 搭建项目

1==> express 项目名 -e
2==> 然后按照提示就可以了
cd 项目名
3==>进入项目 下载依赖
cnpm i 
4==>启动项目
nodemon app.js
5==> 添加监听端口
在app.js 中 在(module.exports = app;前添加)就是在第40行 添加如下,监听端口
app.listen(666, () => {
    console.log('后端服务器启动成功,地址是: http://127.0.0.1:666')
})

下载mysql模块并连接数据库

应为我们要实现crud。所以我们需要与数据库相连接。
因为我们要下载mysql模块连接数据库。
第1步:下载模块 cnpm install mysql
第2步  创建connectmysql.js文件,连接mysql。connectmysql.js文件代码如下
const mysql=require("mysql");
const connection=mysql.createConnection({
    host:"localhost",  //默认链接的是本地
    user:"root",       //用户名
    password:"root",  //密码
    database:"xuexishopsystem"  //链接的是哪个数据库
})
// 下面是测试数据库是否链接成功
connection.query('select 1', (err, data) => {
    if (err) {
        console.log('报错了',err)
    } else {
        console.log('ok',data)
    }
})
// 因为别人要用connection ,所以我要将它暴露出去哦
module.exports=connection;
第3步 执行 node connectmysql.js 看看是否链接成功

实现后端路由

在routes文件夹中新增一个文件。accounts.js文件
这个文件是实现对账号的增加删除更改查询的。
accounts.js 文件代码如下:
var express = require('express');
var router = express.Router();
// 引入连接数据库的模块
const connection=require("./connectmysql.js")
/* GET users listing. */
router.get('/', function(req, res, next) {
  res.send('respond with a resource');
});
module.exports = router;

在app.js中去使用路由

var accountsRouter = require('./routes/accounts'); //引入路由
// /accounts 是路由的前缀
app.use('/accounts', accountsRouter);  //使用路由

cors 处理跨域

安装 cnpm install cors
const cors = require('cors')
//在调用路由之前解决跨域
app.use(cors())
app.use('/', indexRouter);
app.use('/users', usersRouter);
app.use('/accounts', accountsRouter);

前端访问

前端输入: http://127.0.0.1:666/accounts get请求就可以输出respond with a resource

数据库的设计

数据库名称 smsm
表名 account
建表名的SQL命令
create table account (
    id int primary key auto_increment,
    username varchar(30),
    password varchar(30),
    usergroup varchar(30),
    ctime timestamp default current_timestamp
)

在cmd中去连接数据库

mysql -hlocalhost -uroot -proot  [连接数据库]

显示数据库列表

show databases;

创建一个数据库

create database xuexishopsystem;

使用创建的数据库

use xuexishopsystem;

查询某个数据库下的表

show tables;

创建一个表

create table account (
    id int primary key auto_increment,
    username varchar(30),
    password varchar(30),
    usergroup varchar(30),
    ctime timestamp default current_timestamp
);
直接进行复制就可以了,注意别忘记写错分号

Navicat Premium 软件中查看我们创建的数据库和表

在 Navicat Premium 中,我们在左侧的菜单那区域,右击;然后刷新。
就可以看见我们刚刚创建的数据库和表名

你在控制台插入sql语句,需要设置字符集编码

set  names gbk;

app.js的全部代码

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
var accountsRouter = require('./routes/accounts');
const cors = require('cors')
var app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use(cors())
app.use('/', indexRouter);
app.use('/users', usersRouter);
app.use('/accounts', accountsRouter);
// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});
// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};
  // render the error page
  res.status(err.status || 500);
  res.render('error');
});
app.listen(666, () => {
  console.log('后端服务器启动成功,地址是: http://127.0.0.1:666')
})
module.exports = app;

connectmysql.js

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
var accountsRouter = require('./routes/accounts');
const cors = require('cors')
var app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use(cors())
app.use('/', indexRouter);
app.use('/users', usersRouter);
app.use('/accounts', accountsRouter);
// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});
// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};
  // render the error page
  res.status(err.status || 500);
  res.render('error');
});
app.listen(666, () => {
  console.log('后端服务器启动成功,地址是: http://127.0.0.1:666')
})
module.exports = app;

accounts.js

var express = require('express');
var router = express.Router();
// 引入连接数据库的模块
const connection=require("./connectmysql.js")
/* GET users listing. */
router.get('/', function(req, res, next) {
  res.send('respond with a resource');
});
// 添加
router.post('/add', function (req, res) {
  console.log('req.body', req.body)
  let { username, password, usergroup } = req.body || {}
  //怎么知道自己写的这一条sql语句对不对,可以在控制台打印出来。然后执行一下就知道自己的sql语句写对了没有。【非常重要的调试技巧】
  // 1.这里是写语句
  console.log(`insert into account(username, password, usergroup) values('${username}','${password}','${usergroup}')`);
  // 2.执行sql语句
  const sqlStr = `insert into account(username, password, usergroup) values('${username}','${password}','${usergroup}')`;
  connection.query(sqlStr, (err,data) => {
    if (err) {
      res.send({
        code: 1,
        msg:'插入失败,呜呜'
      });
      throw err 
    } else {
      console.log(data)
      if (data.affectedRows>0) {
        res.send({
          code: 0,
          msg:'添加成功'
        });
      } else {
        res.send({
          code: 1,
          msg:'添加数据异常'
        });
      }
    }
  })
});
// 查询
router.post('/lookfor', function (req, res) {
  // 1.这里是写语句
  const sqlStr = 'select * from account';
    // 2.执行sql语句
  connection.query(sqlStr, (err, data) => {
    if (err) {
      res.send({
        code: 1,
        msg:'查询失败'
      });
      throw err 
    } else {
      console.log('查询',data)
        res.send({
          code: 0,
          msg: '查询成功',
          data
        });
      }
  })
});
// 删除
router.get('/del', function (req, res) {
  let { id } = req.query
   // 1.这里是写语句
  const sqlStr = `delete from account where id= ${id}`
    // 2.执行sql语句
  connection.query(sqlStr, (err, data) => {
    if (err) {
      res.send({
        code: 1,
        msg:'删除失败'
      });
      throw err 
    } else {
      //这个判断是否删除成功,因为有可能没有这个id的
      if (data.affectedRows>0) {
        console.log('删除',data)
        res.send({
          code: 0,
          msg:'删除成功'
        });
      } else {
        res.send({
          code: 1,
          msg:'删除失败'
        });
      }
    }
  })
});
// 修改
router.post('/edit', function (req, res) {
  let { username,usergroup,id,password } = req.body
   // 1.这里是写语句 左侧是数据库的字段,右侧是传递过来的值 
  // 这里需要注意一下逗号 不要忘记写
  const sqlStr = `update  account set username= '${username}',  password= '${password}', usergroup= '${usergroup}' where id= ${id}`
  // 2.执行sql语句
  connection.query(sqlStr, (err, data) => {
    if (err) {
      res.send({
        code: 1,
        msg:'修改失败'
      });
      throw err 
    } else {
      //这个判断是否删除成功,因为有可能没有这个id的
      if (data.affectedRows>0) {
        console.log('修改',data)
        res.send({
          code: 0,
          msg:'修改成功'
        });
      } else {
        res.send({
          code: 1,
          msg:'修改失败'
        });
      }
    }
  })
});
module.exports = router;

现在存在的问题

1. 如何高效去处判断前端是否把必须传递的参数传递过来了。
现在写的代码中,都没有去判断参数的正确性,直接进行执行了SQL语句,这样是不正确的。
2.返回体应该进行统一的封装,而不是在请求的时候像现在这样去写重复代码。
3.我现在在执行 select * from account 这样的SQL语句其实性能值非常低的,怎么去优化。

遇见问题,这是你成长的机会,如果你能够解决,这就是收获。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
JavaScript NoSQL 数据库连接
使用Nodejs + express连接数据库mongoose
【6月更文挑战第3天】这篇文章介绍了如何在Express应用中使用Mongoose连接MongoDB数据库。首先,需要创建一个`db.js`文件,然后通过`npm install mongoose`安装Mongoose驱动。接着,在应用中引入MongoDB模块,建立到数据库的连接。创建一个Mongoose schema定义数据模型,如用户信息表。最后,执行数据库操作,包括查询、插入、更新和删除文档,并在完成后关闭数据库连接。文中还提供了相关代码示例。
638 1
|
移动开发 前端开发 JavaScript
uniapp中IO模块(管理本地文件系统)的常用功能封装
uniapp中IO模块(管理本地文件系统)的常用功能封装
2584 1
|
监控 前端开发 测试技术
《解锁前端潜力:自动化流程搭建秘籍》
在项目发展中期,流程优化与效率提升尤为关键。本文详解如何搭建自动化测试、持续集成与部署的完整流程,涵盖Git版本控制、Webpack/Vite构建工具、Jest/Mocha/Karma测试框架、Jenkins/GitLab CI/CD持续集成、Docker/Kubernetes容器化部署及监控反馈机制,助力项目高效稳定推进。
175 0
|
7天前
|
云安全 人工智能 运维
阿里云联动百位企业安全专家,共识Agent防御最佳实践
当Agent成为新员工,你的安全边界在哪里?
1922 6
阿里云联动百位企业安全专家,共识Agent防御最佳实践
|
5天前
|
存储 人工智能 关系型数据库
阿里云AI产品与云产品最新组合套餐:Token Plan、AI coding及云服务器和建站等组合优惠价
阿里云推出全新“算力+模型+应用”一站式云与AI组合套餐活动,覆盖从个人开发者到中大型企业的全场景需求。核心亮点为分三档定价的Token Plan订阅服务,支持Qwen3.8-Max-Preview大模型调用,错峰时段最低可享0.2折优惠。活动同步推出AI Coding、智能体部署、云电脑托管、0代码建站等十余类场景化组合,搭配99元/年的普惠云服务器、88元/年的入门数据库等经典特惠产品,还为企业提供1V1定制化AI转型方案,大幅降低了不同用户群体拥抱AI的技术门槛与采购成本。
652 111
|
15天前
|
人工智能 JSON 安全
Fastjson远程代码执行漏洞,阿里云AI安全为您保驾护航
阿里云AI安全产品联动防御Fastjson攻击
2556 13
Fastjson远程代码执行漏洞,阿里云AI安全为您保驾护航
|
7天前
|
人工智能 弹性计算 数据库
阿里云优惠券种类解析:主要券种区别和适用群体及领取和使用指南
2026年阿里云构建了覆盖全用户的七类优惠券,本文逐一拆解了每类优惠券的核心规则、适用人群与使用技巧:大促限定的阶梯满减券分个人、企业双通道,最高可减800元;学生专属300元无门槛券支持全品类通用;按量付费用户可参与消费达标返券形成循环优惠;新用户有低门槛专享满减券尝鲜;老用户可领取系统自动发放的随机福利券;中大型企业迁云可申请最高100万元的专项补贴;云产品通用券还能在活动价基础上实现折上折。不同身份、不同采购场景的用户均可通过精准匹配对应优惠券,最大化享受优惠力度。
462 110
阿里云优惠券种类解析:主要券种区别和适用群体及领取和使用指南
|
13天前
|
人工智能 前端开发 Linux
Codex 桌面版安装 + CC Switch 接入第三方 API 完整教程(2026 最新)
2026最新教程:手把手教你安装Codex桌面版,通过CC Switch v3.17.0一键接入Fenno等国产API(兼容OpenAI Responses格式),跳过账号登录,完整启用代码审查、多步任务与上下文感知功能。零基础友好,全程图文实操。(239字)
1624 2
|
15天前
|
人工智能 自然语言处理 数据挖掘
Qwen3.8-Max-Preview深度全解析:2.4万亿参数旗舰MoE模型+Token Plan限时优惠完整落地指南
2026年7月,全新旗舰级混合专家大模型Qwen3.8-Max-Preview正式开放抢先体验,作为通义千问Qwen3系列规格最高、综合推理能力顶尖的新一代模型,该模型总参数量达到2.4万亿(2.4T),是当前线上可调用的原生多模态旗舰模型,综合推理水准对标海外顶级Fable 5模型,在复杂工程开发、长文档深度分析、多步骤智能体自治、跨境多语言创作、海量数据挖掘五大高难度业务场景实现跨越式性能提升。
1428 2