如何以正确的方式使用ExpressJs + MySQL

时间:2016-10-07 10:40:12

标签: mysql node.js express

PS:问题似乎很长,但下面有一个小问题。

所以我是不幸的少数人之一,因为它有意义,所以必须使用MySQL和express。这将用作API后端。我使用他们网站上的生成器(https://expressjs.com/en/starter/generator.html)生成了一个快速应用程序,并从mysqljs(https://github.com/mysqljs/mysql)安装了mysql。

现在,express的所有示例都以MongoDb为例,它们只使用了一个包装器。并且mysqljs示例也没有告诉你太多。所以这是我的项目结构,有一些特殊的问题。

bin - auto generated files to start the app
config
models (Maybe have a base model which can talk to db wrapper and other models can extend that)
routes
.... index.js
.... users.js etc etc (each included in the app.js to have some sort of structure)
utils
.... db.js (check code below)
app.js
package.json

现在这就是我在db.js中的内容

var mysql = require('mysql');

var pool = mysql.createPool({
    connectionLimit : 100,
    host: 'localhost',
    user: 'root',
    password: 'notsoblank',
    database: 'somedevdb'
});

module.exports = pool;

在我的路径文件(如users.js,index.js)中,我使用的是:

var express = require('express');
var router = express.Router();
var db = require('../utils/db');
/* GET groups listing. */
router.get('/', function(req, res, next) {
    db.getConnection(function(err, connection) {
        var sql = 'SELECT * from groups';
        connection.query(sql, function(err, rows, fields) {
            if (err) throw err;
            res.json(rows);
        });
        connection.release();
    });
});

module.exports = router;

然后在app.js中,上面的文件将包含在内:

var express = require('express');
var path = require('path');
var logger = require('morgan');

var app = express();

var routes = require('./routes/index');
var users = require('./routes/users');
var groups = require('./routes/groups');

app.use('/apis/groups', groups);

module.exports = app;

现在,如果我正在运行此应用程序,我将拥有一个像localhost:5000\apis\groups这样的API端点,这可以被其他应用程序使用。

以下是基于此的问题:

  1. 我在每个路由文件(index.js,users.js,groups.js)中导入该db.js.这是否意味着每次遇到api时都会创建一个db池?

  2. 我打算为我的工作写很多简单的SQL。现在我知道有很多适配器或OEM,但我只想用getOne或添加或删除等方法编写一个简单的包装器。最好的方法是什么。

  3. Connection.query返回一个promise。如果我想进行一些进一步的操作,那么最好的方法是什么。

  4. 除了将数据库凭据保留在db.js中之外,此方法还有什么其他错误可能会阻止它进行扩展?

1 个答案:

答案 0 :(得分:0)

如果您只是想做一些有助于减少代码膨胀的db帮助程序模块(虽然我觉得这是通过ORM解决的问题),这样做非常简单。只需暴露你想要的任何功能,并隐藏重复的东西。像这样的东西会起作用:

// db.js而不仅仅是公开池

var mysql = require('mysql');

// expose the options so that the calling code can inject the password and so on, probably from config or process.env variables.
function db(options){
  // todo: sanitize options and set defaults
  var pool = mysql.createPool(options);

  return {
     query : function(sql, callback){
       db.getConnection(function(err, connection) {
        connection.query(sql, function(err, rows, fields) {
            callback(err, rows, fields);
            connection.release();
        });
       });
     }

  }

}


module.exports = db;

然后调用代码将执行以下操作:

var db = require('./db')(myOptions);

db.query('select * from groups', console.log);

顺便提一下原始代码有些问题。

1)您在回调中调用connection.release()来获取连接,而不是返回查询。在慢速数据库查询中,可能会导致在完成连接之前释放连接。

2)除非你使用Promise,否则你不应该"扔掉#34;回调中的错误,您必须以某种方式处理它或将其传递给下一个回调(如果它们是一个)。