Node + Express + MySQL 接口开发完整案例

本文涉及的产品
RDS AI 助手,专业版
RDS Agent(兼容OpenClaw),2核4GB
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
简介: Node + Express + MySQL 接口开发完整案例


先上目录结构:
​​
​​2018122710325389.png

简单描述一下,主要的目录文件
config /
           dbConfig: 文件配置了,数据库信息
           DBHelp: 数据库连接池的连接与释放
controller:放置开发的接口
routes: 接口抛出(接口路由层)
app 启动入口,配置接口跨域,返回字符编码···

dbConfig.js

const config = {

// 启动端口
port: 3000,
// 数据库配置
database: {
    DATABASE: 'test',
    USERNAME: 'root',
    PASSWORD: '密码',
    PORT: '3306',
    HOST: 'localhost',
    insecureAuth : true,
    useConnectionPooling: true
}

}

module.exports = config

DBHelp.js

let DB_MYSQL = require('mysql');
let DB_CONFIG = require('../config/dbConfig');
/**

  • 数据库连接池
  • @type {Pool}

*/
let pool = DB_MYSQL.createPool({

host: DB_CONFIG.database.HOST,
user: DB_CONFIG.database.USERNAME,
password: DB_CONFIG.database.PASSWORD,
database: DB_CONFIG.database.DATABASE,
port: DB_CONFIG.database.PORT

});
/**

  • 通用方法
  • @param sql
  • @param options
  • @param callback

*/
let query = (sql, options, callback) =>{

pool.getConnection((error, connection) =>{
    if (error) {
        callback(error, null, null);
    } else {
        connection.query(sql, options, (error, results, fields) =>{
            //释放连接
            connection.release();
            //事件驱动回调
            callback(error, results, fields);
        });
    }
});

};
module.exports=query;

controller/ ····

/**

  • 获取列表
  • @type {Connection}

*/
let _ = require('lodash')
let DBHelp = require('../../config/DBHelp.js');
let getArticle = (data, success) =>{

// SQL 语句
let SQL = 'SELECT * FROM websites';
let counter = 0
let SQL_ = SQL+' WHERE ';
// 多个条件时循环data去除key, val
_.forEach(data, (key, val) =>{
    if (counter > 0){
        SQL = SQL+ ' AND ' + val + ' = ' + key;
    } else {
        SQL = SQL_+ val + '= ' + key + ' OR name LIKE %' + key +'%';
    }
    counter++
});
/**
 * resultData
 * @code: 状态码
 * @data:data
 * @codeMessage: 状态消息
 */
const resultData = {
    code: null,
    data: null,
    codeMessage: null
}
DBHelp(SQL, (error, result, fields) =>{
    if(error){
        resultData.error = error.message
    }
    resultData.code = 200;
    resultData.data = result;
    resultData.codeMessage = 'success'
    success(resultData);
})

}
module.exports = getArticle

router/index.js

let express = require('express');
let router = express.Router();
let getArticle = require('../controller/article/getArticle_controller.js');
let addArticle = require('../controller/article/addArticle_controller.js');
/**

  • 数据查询

*/
router.get('/article/list/get', (request, response, next)=>{
getArticle(request.query, data =>{

response.end(JSON.stringify(data));

})
});
/**

  • 数据新增
  • @type {Router|router}
  • request.body.XX

*/
router.post('/article/list/add', (request, response, next)=>{
request.body = {

name: '测试',
url: 'http://www.test.aa',
alexa: '32',
country: 'CN'

}

addArticle(request.body, data =>{

response.end(JSON.stringify(data));

})
});
module.exports = router;

app.js

let createError = require('http-errors');
let express = require('express');
let path = require('path');
let cookieParser = require('cookie-parser');
let logger = require('morgan');

let indexRouter = require('./routes/index');
let usersRouter = require('./routes/users');

let app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'pug');

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.all('*',function(request, response, next){
response.header('Access-Control-Allow-Origin','*');
response.header('Access-Control-Allow-Headers','X-Requested-With');
response.header('Access-Control-Allow-Methods','PUT,POST,GET,DELETE,OPTIONS');
response.header('X-Powered-By','3.2.1');
response.header('Content-Type','application/json;charset=utf-8');
next();
});
// 抛出接口
app.use('/', indexRouter);
app.use('/users', usersRouter);

// 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');
});

module.exports = app;

// 下面奉上运行结果:(post方法用postman测试就好啦!)

20181227104233726.png

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
8月前
|
SQL 关系型数据库 MySQL
Mysql数据恢复—Mysql数据库delete删除后数据恢复案例
本地服务器,操作系统为windows server。服务器上部署mysql单实例,innodb引擎,独立表空间。未进行数据库备份,未开启binlog。 人为误操作使用Delete命令删除数据时未添加where子句,导致全表数据被删除。删除后未对该表进行任何操作。需要恢复误删除的数据。 在本案例中的mysql数据库未进行备份,也未开启binlog日志,无法直接还原数据库。
|
关系型数据库 MySQL 大数据
大数据新视界--大数据大厂之MySQL 数据库课程设计:MySQL 数据库 SQL 语句调优的进阶策略与实际案例(2-2)
本文延续前篇,深入探讨 MySQL 数据库 SQL 语句调优进阶策略。包括优化索引使用,介绍多种索引类型及避免索引失效等;调整数据库参数,如缓冲池、连接数和日志参数;还有分区表、垂直拆分等其他优化方法。通过实际案例分析展示调优效果。回顾与数据库课程设计相关文章,强调全面认识 MySQL 数据库重要性。为读者提供综合调优指导,确保数据库高效运行。
|
前端开发 JavaScript NoSQL
使用 Node.js、Express 和 React 构建强大的 API
本文详细介绍如何使用 Node.js、Express 和 React 构建强大且动态的 API。从开发环境搭建到集成 React 前端,再到利用 APIPost 高效测试 API,适合各水平开发者。内容涵盖 Node.js 运行时、Express 框架与 React 库的基础知识及协同工作方式,还涉及数据库连接和前后端数据交互。通过实际代码示例,助你快速上手并优化应用性能。
|
存储 SQL 关系型数据库
服务器数据恢复—云服务器上mysql数据库数据恢复案例
某ECS网站服务器,linux操作系统+mysql数据库。mysql数据库采用innodb作为默认存储引擎。 在执行数据库版本更新测试时,操作人员误误将在本来应该在测试库执行的sql脚本在生产库上执行,导致生产库上部分表被truncate,还有部分表中少量数据被delete。
343 25
|
SQL 关系型数据库 MySQL
数据库数据恢复——MySQL简介和数据恢复案例
MySQL数据库数据恢复环境&故障: 本地服务器,安装的windows server操作系统。 操作系统上部署MySQL单实例,引擎类型为innodb,表空间类型为独立表空间。该MySQL数据库没有备份,未开启binlog。 人为误操作,在用Delete命令删除数据时未添加where子句进行筛选导致全表数据被删除,删除后未对该表进行任何操作。
|
存储 关系型数据库 MySQL
10个案例告诉你mysql不使用子查询的原因
大家好,我是V哥。上周与朋友讨论数据库子查询问题,深受启发。为此,我整理了10个案例,详细说明如何通过优化子查询提升MySQL性能。主要问题包括性能瓶颈、索引失效、查询优化器复杂度及数据传输开销等。解决方案涵盖使用EXISTS、JOIN、IN操作符、窗口函数、临时表及索引优化等。希望通过这些案例,帮助大家在实际开发中选择更高效的查询方式,提升系统性能。关注V哥,一起探讨技术,欢迎点赞支持!
660 5
|
关系型数据库 MySQL 数据库
数据库数据恢复—MYSQL数据库文件损坏的数据恢复案例
mysql数据库文件ibdata1、MYI、MYD损坏。 故障表现:1、数据库无法进行查询等操作;2、使用mysqlcheck和myisamchk无法修复数据库。
|
Web App开发 JSON JavaScript
Node.js 中的中间件机制与 Express 应用
Node.js 中的中间件机制与 Express 应用
|
缓存 负载均衡 JavaScript
构建高效后端服务:Node.js与Express框架实践
在数字化时代的浪潮中,后端服务的重要性不言而喻。本文将通过深入浅出的方式介绍如何利用Node.js及其强大的Express框架来搭建一个高效的后端服务。我们将从零开始,逐步深入,不仅涉及基础的代码编写,更会探讨如何优化性能和处理高并发场景。无论你是后端新手还是希望提高现有技能的开发者,这篇文章都将为你提供宝贵的知识和启示。
|
JavaScript 前端开发 中间件
探索后端技术:Node.js与Express框架的完美融合
【10月更文挑战第7天】 在当今数字化时代,Web应用已成为日常生活不可或缺的一部分。本文将深入探讨后端技术的两大重要角色——Node.js和Express框架,分析它们如何通过其独特的特性和优势,为现代Web开发提供强大支持。我们将从Node.js的非阻塞I/O和事件驱动机制,到Express框架的简洁路由和中间件特性,全面解析它们的工作原理及应用场景。此外,本文还将分享一些实际开发中的小技巧,帮助你更有效地利用这些技术构建高效、可扩展的Web应用。无论你是刚入门的新手,还是经验丰富的开发者,相信这篇文章都能为你带来新的启发和思考。

推荐镜像

更多