node+express框架中连接使用mysql(经验总结)


Posted in Javascript onNovember 10, 2018

最近在学习node.js,做了一个练手项目,使用node.js+express框架,配合mysql数据库和前端vue框架开发一个多人文档编辑系统。

node.js环境下express+mysql的服务端项目示例

首先是环境搭建:

node环境下

$ npm install -g express-generator
$ express -e project

进入项目文件根目录安装依赖模块

$ npm install
$ DEBUG=node-blog:* npm start

看看项目目录都有什么

node+express框架中连接使用mysql(经验总结)

看看生成的工程目录里面都有什么,

bin:存放可执行文件

node_modules:存放 package.json 中安装的模块,当你在 package.json 添加依赖的模块并安装后,存放在这个文件夹下

public:存放 image、css、js 等前端资源文件

routes:存放路由文件

views:存放视图文件或者说模版文件

app.js:启动文件,或者说入口文件

package.json:存储着工程的信息及模块依赖,当在 dependencies 中添加依赖的模块时,运行npm install ,npm 会检查当前目录下的 package.json,并自动安装所有指定的模块

下面开始安装数据库,这里我选择的是mysql。

npm install mysql --save-dev

安装完毕之后,开始配置数据库。

//mysql配置文件
mysql = {

    host: "xx.xxx.xx.xxx", //这是数据库的地址

    user: "xxx", //需要用户的名字

    password: "xxx", //用户密码 ,如果你没有密码,直接双引号就是

    database: "xxx" //数据库名字

  } //好了,这样我们就能连接数据库了

  module.exports = mysql; //用module.exports暴露出这个接口,
mysql连接池配置:

//mysql连接池配置文件
var mysql = require('mysql');
var $dbConfig = require('../config/mysql');//注意改成自己项目中mysql配置文件的路径

// 使用连接池,避免开太多的线程,提升性能
var pool = mysql.createPool($dbConfig);

/**
 * 对query执行的结果自定义返回JSON结果
 */
function responseDoReturn(res, result, resultJSON) {
  if (typeof result === 'undefined') {
    res.json({
      code: '201',
      msg: 'failed to do'
    });
  } else {
    res.json(result);
  }
};

/**
 * 封装query之sql带不占位符func
 */
function query(sql, callback) {
  pool.getConnection(function(err, connection) {
    connection.query(sql, function(err, rows) {
      callback(err, rows);
      //释放链接
      connection.release();
    });
  });
}

/**
 * 封装query之sql带占位符func
 */
function queryArgs(sql, args, callback) {
  pool.getConnection(function(err, connection) {
    connection.query(sql, args, function(err, rows) {
      callback(err, rows);
      //释放链接
      connection.release();
    });
  });
}

//exports
module.exports = {
  query: query,
  queryArgs: queryArgs,
  doReturn: responseDoReturn
}

操作数据库的过程比较灵活,我是使用模块化的思想,将一张数据表封装成一个模块暴露出去,通过该模块获取这张表的增删改查SQL语句。下面贴上示例代码:

let express = require('express');
let mysql = require('../common/basicConnection');

let qibu_task = {
  index: '',
  value: '',
  list: `SELECT * from qibu_task;`, //列表查询
  insert(args) {
    qibu_task.index = '';
    qibu_task.value = '';
    args = filter(['id', 'task', 'name', 'created_at'], args)
    for (let key in args) {
      qibu_task.index = `${qibu_task.index}${key},`
      let re = /^[0-9]+.?[0-9]*/;
      if (re.test(args[key])) {
        qibu_task.value = `${qibu_task.value}${args[key]},`
      } else {
        qibu_task.value = `${qibu_task.value}'${args[key]}',`
      }
    }
    qibu_task.index = qibu_task.index.substr(0, qibu_task.index.length - 1);
    qibu_task.value = qibu_task.value.substr(0, qibu_task.value.length - 1);

    return `INSERT INTO qibu_task (${qibu_task.index}) VALUES(${qibu_task.value})`;
  }, //按需增加
  select(index, value) {
    return `SELECT * from qibu_task where ${index}=${value};` //按需查询
  },
  delete(index, value) {
    return `DELETE from qibu_task where ${index}=${value};` //按需删除
  },
  update(index, args) { //提交修改
    if (index in args) {
      qibu_task.value = '';
      args = filter(['id', 'task', 'name', 'created_at'], args)
      for (let key in args) {
        let re = /^[0-9]+.?[0-9]*/;
        if (re.test(args[key])) {
          qibu_task.value = `${qibu_task.value}${key}=${args[key]},`
        } else {
          qibu_task.value = `${qibu_task.value}${key}='${args[key]}',`
        }
      }
      qibu_task.value = qibu_task.value.substr(0, qibu_task.value.length - 1)
      return `UPDATE qibu_task SET ${qibu_task.value} WHERE ${index}=${args[index]};`
    }
  },
};
//参数过滤
function filter(arguments, obj) {
  let newObj = {}
  arguments.forEach(every => {
    if (every in obj) {
      newObj[every] = obj[every]
    }
  });
  return newObj;
};
module.exports = qibu_task;

然后就可以在路由返回时进行数据库操作啦。具体代码就不贴啦。路由可以识别get、post方法,修改和删除通过传递参数模拟。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Extjs gridpanel 出现横向滚动条问题的解决方法
Jul 04 Javascript
扩展JavaScript功能的正确方法(译文)
Apr 12 Javascript
javascript实现根据身份证号读取相关信息
Dec 17 Javascript
精通JavaScript的this关键字
May 28 Javascript
JavaScript DOM节点操作方法总结
Aug 23 Javascript
JavaScript仿聊天室聊天记录
Dec 27 Javascript
微信小程序 自定义对话框实例详解
Jan 20 Javascript
Vue之Watcher源码解析(1)
Jul 19 Javascript
基于input框覆盖掉数字英文的实例讲解
Jul 21 Javascript
浅谈vue的iview列表table render函数设置DOM属性值的方法
Sep 30 Javascript
Vue官方推荐AJAX组件axios.js使用方法详解与API
Oct 09 Javascript
使用Canvas绘制一个游戏人物属性图
Mar 25 Javascript
vue axios请求频繁时取消上一次请求的方法
Nov 10 #Javascript
微信小程序实现跑马灯效果
Oct 21 #Javascript
微信小程序使用scroll-view标签实现自动滑动到底部功能的实例代码
Nov 09 #Javascript
vue.js自定义组件directives的实例代码
Nov 09 #Javascript
详解处理Vue单页面应用SEO的另一种思路
Nov 09 #Javascript
webpack 静态资源集中输出的方法示例
Nov 09 #Javascript
vue中如何去掉空格的方法实现
Nov 09 #Javascript
You might like
PHP网站基础优化方法小结
2008/09/29 PHP
PHP 高级课程笔记 面向对象
2009/06/21 PHP
php判断GIF图片是否为动画的方法
2020/09/04 PHP
PHP基于数组实现的分页函数实例
2014/08/20 PHP
PHP中获取文件创建日期、修改日期、访问时间的方法
2016/11/05 PHP
用JavaScript实现单继承和多继承的简单方法
2009/03/29 Javascript
Mootools 1.2教程 排序类和方法简介
2009/09/15 Javascript
一样的table?不一样的table(可编辑状态table)
2012/09/19 Javascript
JS上传图片前的限制包括(jpg jpg gif及大小高宽)等
2012/12/19 Javascript
简单方法判断JavaScript对象为null或者属性为空
2014/09/26 Javascript
jQuery添加和删除指定标签的方法
2015/12/16 Javascript
jQuery表格插件datatables用法详解
2020/11/23 Javascript
详解JS几种变量交换方式以及性能分析对比
2016/11/25 Javascript
bootstrap导航、选项卡实现代码
2016/12/28 Javascript
bootstrapValidator表单验证插件学习
2016/12/30 Javascript
Nodejs中使用phantom将html转为pdf或图片格式的方法
2017/09/18 NodeJs
详解Vue 换肤方案验证
2019/08/28 Javascript
vue 如何从单页应用改造成多页应用
2020/10/23 Javascript
[01:55]《走出家门看比赛》——DOTA2 2015国际邀请赛同城线下观战
2015/07/18 DOTA
[01:00:10]完美世界DOTA2联赛PWL S2 FTD vs Inki 第二场 11.21
2020/11/24 DOTA
介绍Python的Urllib库的一些高级用法
2015/04/30 Python
详解Python的Flask框架中生成SECRET_KEY密钥的方法
2016/06/07 Python
centos6.5安装python3.7.1之后无法使用pip的解决方案
2019/02/14 Python
PyQt5 QTableView设置某一列不可编辑的方法
2019/06/25 Python
使用python制作游戏下载进度条的代码(程序说明见注释)
2019/10/24 Python
Python 实现敏感目录扫描的示例代码
2020/05/21 Python
浅谈tensorflow使用张量时的一些注意点tf.concat,tf.reshape,tf.stack
2020/06/23 Python
python利用递归方法实现求集合的幂集
2020/09/07 Python
为智能设备设计个性化保护套网站:caseable
2017/01/05 全球购物
美国LOGO设计公司:The Logo Company
2018/07/16 全球购物
电子商务专业学生的自我鉴定
2013/11/28 职场文书
建筑工程专业大学生求职信
2014/04/23 职场文书
法院信息化建设方案
2014/05/21 职场文书
中标通知书范本
2015/04/17 职场文书
使用tensorflow 实现反向传播求导
2021/05/26 Python
Python机器学习之决策树和随机森林
2021/07/15 Javascript