基于节点mysql的模块无法正常工作

时间:2017-03-11 15:08:33

标签: javascript mysql node.js

我有一个基于节点的应用程序,它将查看数据库中的数据。因为数据库相当大,有几个表,所以我正在编写一个模块来帮助模块化任务。问题是我无法获取主代码来从数据库查找中返回所有数据,因为我相信程序在执行之前会退出。如何让节点模块工作?我的目的是让DB帮助程序函数驻留在SomethingHelper.js模块中。我的主代码silly.js看起来像这样:

// silly.js
var sh = require('./SomethingHelpers.js');
helper = new sh();

helper.then(function(res) {
  var promise = helper.getAllForUsername('sonny');
  promise.then(function(res) {
    console.log('worked', res);
  });
  promise.catch(function(err) {
    console.log('err: ', err);
  });
});
helper.catch(function(err) {
  console('Could not create object: ', err);
});

SomethingHelpers.js看起来像这样:

var mysql = require("mysql");

function SomethingHelpers() {
  return new Promise(function(resolve, reject) {
    this.connectionPool = mysql.createPool({
      connectionLimit: 100,
      host: 'server.somewhere.com',
      user: "username",
      password: "somepass",
      database: "sillyDB",
      debug: false
    });
  });
}

SomethingHelpers.prototype.getAllSomethingForUsername = function(username) {
    var result = [];

    return new Promise(function(resolve, reject) {
      this.connectionPool.getConnection(function(err, connection) {
        if (err) {
          console.log('Error connecting to the silly database.');
          return;
        } else {
          console.log('Connection established to the silly database.      Super-Duper!');
          return connection.query('SELECT something FROM somethingTable where username=\"' + username + '\"',
            function(err, rows, field) {
              connection.release();
              if (!err) {
                //console.log (rows.something);
                rows.forEach(function(item) {
                  var allSomething = JSON.parse(item.something);
                  console.log(allSomething.length);
                  result.push(allSomething);
                  for (var i = 0; i < allSomething.length; i++) {
                    console.log(allSomething[i].handle);
                  }
                  console.log('\n\n');
                });
                console.log('Done');
                return result;
              } else {
                console.log('Eeeeeeeek!');
                //console.log (result);
                return result;
              }
            });
        }
      });
    });
  } // End of getAllSomething ()

module.exports = SomethingHelpers;

1 个答案:

答案 0 :(得分:0)

我找到了自己问题的答案。这是我解决它的方式。首先,SomethingHelpers.js

//SomethingHelpers.js
var mysql = require('promise-mysql');

function SomethingHelpers () {
    this.pool = mysql.createPool({
    connectionLimit: 100,
    host: 'server.somewhere.com',
    user: "username",
    password: "somepass",
    database: "sillyDB",
    debug: false
    });
}

SomethingHelpers.prototype.getAllSomethingsForThisUsername = function (username) {
    let pool = this.pool;
    return new Promise(function (resolve, reject) {
    pool.getConnection ().then(function(connection) {
        connection.query('SELECT something FROM somethingsTable where username=\"'+
             username+'\"').
        then (function (rows) {
            resolve (getAllSomethings (rows));
        }).catch (function (error) {
            console.log ('Error: ', error);
        });
    });
    });
}

function getAllSomethings (rows)
{
    var result = [];
    rows.forEach (function (item) {
    var allSomethings = JSON.parse(item.something);
    result.push (allSomethings);
    });
    return result;
}

module.exports = SomethingHelpers;

凭借Promise的荣耀,可以享受助手模块的赏金:

//silly.js
var hh = require ('./SomethingHelpers');
helper = new hh ();

thePromiseOfSomething = helper.getAllSomethingsForThisUsername ('sonny');
thePromiseOfSomething.then(function (rows) {
    console.log (rows);
});

从而使我脱离异步思维的暴政(J / K)。