V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Harldwell
V2EX  ›  推广

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

  •  
  •   Harldwell · 2018-11-09 14:47:29 +08:00 · 1303 次点击
    这是一个创建于 2208 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在学习 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
    

    看看项目目录都有什么

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

    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 方法,修改和删除通过传递参数模拟。 enter image description here

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5257 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 09:42 · PVG 17:42 · LAX 01:42 · JFK 04:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.