使用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语句其实性能值非常低的,怎么去优化。

express学会CRUD的更多相关文章

  1. 【原】无脑操作:express + MySQL 实现CRUD

    基于node.js的web开发框架express简单方便,很多项目中都在使用.这里结合MySQL数据库,实现最简单的CRUD操作. 开发环境: IDE:WebStorm DB:MySQL ------ ...

  2. 10天学会phpWeChat——第九天:数据库增、删、改、查(CRUD)操作

    数据库的操作(CRUD)是一个现代化计算机软件的核心,尤其针对web应用软件.虽然在前面的几讲里,我们针对数据库操作大致有了一些了解,但今天我们需要再次强化下. 除了新瓶装老酒,我们今天还引入一个新的 ...

  3. 【nodejs】用express又做了份crud

    感觉crud是高级形式的hello world了. app代码: 'use strict'; var express=require('express'); var http=require('htt ...

  4. express——crud

    使用express框架做一个简单的增删改查demo,先上效果图: 1.使用webstrom新建一个express项目,建好的项目文件是这样的: 2.直接上代码,方便学习db.js /** * Crea ...

  5. express+jade+bootstrap+mongdb simple CRUD test

    1:当前环境 y@y:~$ node --version && express -V && mongo --version v0.12.2 MongoDB shell ...

  6. Node+Express+MongoDB+Socket.io搭建实时聊天应用实战教程(一)--MongoDB入门

    前言 本文并不是网上流传的多少天学会MongoDB那种全面的教程,而意在总结这几天使用MongoDB的心得,给出一个完整的Node+Express+MongoDB+Socket.io搭建实时聊天应用实 ...

  7. win7下安装配置nodejs、使用npm安装express

    1.下载node http://nodejs.cn/download/ 这里下载自己需要的 我的环境是win764,下载地址是:https://nodejs.org/dist/v6.2.0/win-x ...

  8. Web API 之CRUD

    注:例子来自微软Web API官网(https://www.asp.net/web-api/overview/data/using-web-api-with-entity-framework/part ...

  9. Oracle Database 11g Express Editon介绍及安装

    一.Oracle Database 11g Express版本介绍 公司项目开发中,使用的数据库是Oracle 10g和MySQL 5.5,最新因为开发需要,需要从后台读取一些数据.使用的客户端是PL ...

  10. 【grunt第二弹】30分钟学会使用grunt打包前端代码(02)

    前言 上一篇博客,我们简单的介绍了grunt的使用,一些基础点没能覆盖,我们今天有必要看看一些基础知识 [grunt第一弹]30分钟学会使用grunt打包前端代码 配置任务/grunt.initCon ...

随机推荐

  1. 华为AppCube通过中国信通院“低代码开发平台通用能力要求”评估!

    摘要:华为AppCube应用魔方顺利通过信通院评估,被认证为具备 "低代码开发平台通用能力"的企业服务平台. 本文分享自华为云社区<华为AppCube通过中国信通院" ...

  2. HanLP 学习

    学习 HanLP 需要了解, 双数组Trie树 (Double-array Trie) Aho-Corasick DoubleArrayTire 算法 ACDAT - 基于双数组字典树的AC自动机 T ...

  3. Java SpringBoot Test 单元测试中包括多线程时,没跑完就结束了

    如何阻止 Java SpringBoot Test 单元测试中包括多线程时,没跑完就结束了 使用 CountDownLatch CountDownLatch.CyclicBarrier 使用区别 多线 ...

  4. Mybatis 模块拆份带来的 Mapper 扫描问题

    项目中,两个模块中都放了 Mapper,如下所示 @MapperScan(basePackages ={"com.vipsoft.his.mapper","com.vip ...

  5. 【JAVA基础】日志管理

    LOGGER.debug("Request uri: {}, headers: {}", signedRequest.getURI(), signedRequest.getAllH ...

  6. KYOCERA Programming Contest 2021(AtCoder Beginner Contest 200)(AB水题,C思维,D搜索,E DP)

    补题链接:Here A - Century 整除 \(200\) 并且判断能否整除完全 B - 200th ABC-200 按题意即可 C - Ringo's Favorite Numbers 2 求 ...

  7. 安装Amos结构方程模型分析软件的方法

      本文介绍IBM SPSS Amos软件的安装方法.   Amos是IBM公司旗下一款强大的结构方程建模软件.其捆绑在高级版的SPSS Statistics软件中,但其它版本的SPSS Statis ...

  8. springboot项目pom文件设置<profile>读取不同的配置文件(网上瞎copy的大把,测试过真实可用)

    这篇文章主要介绍关于springboot如何通过多个properties实现数据库环境部署时自动切换配置的两种方式,部署时切换方式和打包时Maven控制方式.

  9. 传统能源转型:数字孪生智慧火电厂 3D 可视化

    前言 火力发电厂满足了全世界将近五成的电力需求,在我国超过半数以上的电力来源于火力发电.随着双碳政策的推行,在国家清洁能源消纳和环保的需求下,对火电厂在深度调峰.超低排放.灵活运行等方面提出了更高要求 ...

  10. 最全!即学即会 Serverless Devs 基础入门(上)

    作者 | 刘宇(花名:江昱) 在上篇<即学即会 Serverless | 如何解决 Serverless 应用开发部署的难题>中,我们阐述了工具链的重要性,那么本文将带领各位快速实现 Se ...