nodejs - невозможно получить данные из вспомогательной функции

Я использую ExpressJS 4 для своего проекта, и он соответствует архитектуре MVC. Я создал помощник, в котором я могу писать часто используемые функции, которые запрашивают данные из БД (сухой подход), и к ним можно получить доступ с любого контроллера. Я могу вызывать вспомогательные функции и передавать им данные, но не могу запросить из них базу данных.

Вот пример моего контроллера (dumyController.js):

'use strict';
var dbHelpers = require('../helpers/helpers');

exports.dummyFunction = function (req, res) {
    var id=165;
    var abc = dbHelpers.dummyHelperFunction(iddd);
    console.log(abc);
};

Как видите, я вызываю вспомогательную функцию в контроллере. Вот пример помощника (helpers.js)

var db = require('../db');
module.exports = {
  dummyHelperFunction: function (passvar) {
    var params = [passvar];
    var query = `SELECT email FROM members where id=?`;
    return db.query(query, params);
  }
};

Если вам интересно, есть ли что-то не так с моим подключением к БД, с этим проблем нет. Тем не менее, делюсь этим (db.js)

var mysql = require('mysql');
var connection = mysql.createPool({
    host: '127.0.0.1',
    user: 'root',
    password: '',
    database: 'dumyDB'
});
module.exports = connection;

Я пытаюсь получить результат, возвращаемый запросом MySQL, но это то, что я получаю, когда я запускаю его в console.log.

Query {
  domain: null,
  _events: {},
  _eventsCount: 0,
  _maxListeners: undefined,
  _callback: undefined,
  _callSite:
   Error
       at Pool.query (_PROJECT-PATH_\node_modules\mysql\lib\Pool.js:199:23)
       at Object.dummyHelperFunction (_PROJECT-PATH_\helpers\helpers.js:18:15)
       at exports.dummyFunction (_PROJECT-PATH_\controllers\dumyController.js:227:25)
       at Layer.handle [as handle_request] (_PROJECT-PATH_\node_modules\express\lib\router\layer.js:95:5)
       at next (_PROJECT-PATH_\node_modules\express\lib\router\route.js:137:13)
       at Route.dispatch (_PROJECT-PATH_\node_modules\express\lib\router\route.js:112:3)
       at Layer.handle [as handle_request] (_PROJECT-PATH_\node_modules\express\lib\router\layer.js:95:5)
       at _PROJECT-PATH_\node_modules\express\lib\router\index.js:281:22
       at Function.process_params (sam_PROJECT-PATH_ple\node_modules\express\lib\router\index.js:335:12)
       at next (_PROJECT-PATH_\node_modules\express\lib\router\index.js:275:10),
  _ended: false,
  _timeout: undefined,
  _idleNext: null,
  _idlePrev: null,
  _idleStart: null,
  _idleTimeout: -1,
  _repeat: null,
  sql: 'SELECT email FROM members where id=?',
  values: [ 165 ],
  typeCast: true,
  nestTables: false,
  _resultSet: null,
  _results: [],
  _fields: [],
  _index: 0,
  _loadError: null }

person version 2    schedule 03.10.2017    source источник
comment
Для db.query() требуется функция обратного вызова, с помощью которой можно получить результат. Запрос асинхронный, поэтому вы не можете просто return его выполнить.   -  person Patrick Roberts    schedule 03.10.2017
comment
Если я это сделаю, какие изменения я должен внести в функцию контроллера? Я новичок в nodejs @Patrick Roberts   -  person version 2    schedule 03.10.2017
comment
вот пример с обратным вызовом   -  person Dmitry Shvetsov    schedule 03.10.2017


Ответы (1)


Изменил ваш код на что-то вроде приведенного ниже. db.query() является асинхронным

Контроллер

'use strict';
var dbHelpers = require('../helpers/helpers');
exports.dummyFunction = function (req, res) {
    var user = {
        passvar: 165
    };
    dbHelpers.dummyHelperFunction(user, function (err, rows) {
        if (err) {
            res.json({ success: false, message: 'unable to fetch' });
        }
        else {
            res.json({ success: true, values: rows });
        }
    });
};

Помощник

var db = require('../db');
module.exports = {
  dummyHelperFunction: function (param, callback) {
    var params = [param.passvar];
    var query = `SELECT email FROM members where id=?`;
    return db.query(query, params, callback);
  }
};
person Lonewolf    schedule 03.10.2017
comment
Вам не нужен оператор return. - person alexmac; 03.10.2017