youngwind / blog

梁少峰的个人博客
4.66k stars 385 forks source link

nodejs使用mysql包操作数据库 #43

Open youngwind opened 8 years ago

youngwind commented 8 years ago

问题

这年头,不会点node都不好意思说自己是前端。ok,下面显示的是一个添加用户和显示所有用户的一个简单demo。

准备条件

  1. express
  2. express generator生成的项目
  3. npm install mysql --save
  4. 电脑安装了mysql
  5. 创建数据库test和数据表mytable,mytable有两个字段。id:int(4), name:varchar(20)(当然,名字你可以随便取,下面相应的改变代码就好了)

    使用方法

    1. 把mysql的配置写在配置文件中

// config.js
module.exports = {
  // MySQL数据库联接配置
  mysql: {
    host: '127.0.0.1',
    user: 'root',
    password: '',
    database:'test', // 数据库名字
    port: 3306
  }
};

2. 添加路由

// routers/users.js
// 增加用户
router.get('/addUser', function (req, res, next) {
  user.add(req, res, next);
});

// 返回所有用户
router.get('/allUser', function (req, res, next) {
  user.all(req, res, next);
});

3. 定义sql查询语句

// 定义文件 controller/userSqlMapping.js
var user = {
  insert:'INSERT INTO mytable(id, name) VALUES(?,?)',
  queryAll: 'select * from mytable'
};

module.exports = user;

4. 编写控制器中间件

// controller/user.js

"use strict";

// 实现与MySQL交互
var mysql = require('mysql');
var config = require('../common/config.js');
var $sql = require('./userSqlMapping');

module.exports = {

  // 添加用户
  add: function (req, res, next) {
    var param = req.query || req.params;
    var connection = mysql.createConnection(config.mysql);
    connection.connect();
    connection.query($sql.insert, [param.id, param.name], function (err, rows, fields) {
      if (err) {
        res.json({
          code: '1',
          msg: '操作失败'
        });
      }
      res.json({
        code: 200,
        msg: "增加成功"
      });
    });
    connection.end();
  },

  // 返回用户信息
  all: function (req, res, next) {
    var connection = mysql.createConnection(config.mysql);
    connection.connect();
    connection.query($sql.queryAll, function (err, rows, fields) {
      if (err) {
        res.json({
          code: '1',
          msg: '操作失败'
        });
      }
      res.json({
        code: 200,
        msg: rows
      });
    });
    connection.end();
  }
};

5.演示结果

添加用户

2016-03-14 8 15 52

查询用户

2016-03-14 8 17 01

查看数据库

2016-03-14 8 17 50

问题

  1. 每回都需要打开和关闭mysql连接,这显然是性能上的浪费,而且也会造成代码上的冗余,应该寻找解决方案。
  2. 查询语句是通过硬编码预先设定好的,这显然不够灵活,不能满足以后千奇百怪的各种sql操作,应该有封装好的包可以使用。
  3. 错误码是随便写的,是否有业内通用的错误码?而且错误码应该定义在一个统一的地方。
  4. 错误抛出与res返回错误提示应该是什么样的关系?
  5. 没有进行参数的校验。

参考资料: http://www.alloyteam.com/2015/03/sexpressmysql/