Экспортировать соединение MySQL для использования с другими модулями в Node / Express с использованием обещания-mysql? - PullRequest
0 голосов
/ 04 ноября 2018

Попытка импортировать и использовать модуль базы данных в одном из моих контроллеров. Первоначальное соединение зарегистрировано, однако, я получаю следующую ошибку при обращении к любому из моих маршрутов из браузера:

"Невозможно прочитать свойство 'запрос' из неопределенного"

Переменная соединения в файле database.js, очевидно, не установлена, но я не могу понять почему.


database.js

const mysql = require("promise-mysql");
const config = require("../config");

let connection;

mysql.createConnection(config.MYSQL)
.then(conn => {
  connection = conn
  console.log('Connected to ', config.MYSQL.database)
})
.catch(function (error) {
  console.log(error)
})

module.exports = connection;

schools.js

const router = require('express').Router()
const Schools = require('../controllers/schools-controller')

const schools = new Schools

router.get('/', schools.getAllSchools)
...

module.exports = router

школа-controller.js

const db = require("../lib/database");


module.exports = class Schools {

 async getAllSchools (req, res, next) {

  const queryString = 'SELECT * FROM schools ORDER BY school_id ASC LIMIT 5'

  try {
    const results = await db.query(queryString);
    if (results == "") {
     res.status(404).json({ message: "No schools found" });
    } else {
      res.status(200).json(results);
    }
  } catch(error) {
    next(error)
  }
 };
 ...

}

Ниже приведена функция пула, которую я в итоге использовал, основываясь на ответе @ Sven

database.js

const pool = mysql.createPool(config.MYSQL);
pool.getConnection()
  .then(function(connection) {
    console.log(`Connected to database: ${config.MYSQL.database}`);
    pool.releaseConnection(connection)
  })
  .catch(function(error) {
    console.error(error.message);
  });

module.exports = pool;

1 Ответ

0 голосов
/ 04 ноября 2018

Вы не можете экспортировать значение, полученное в асинхронном режиме. Как и везде в Node, вы должны использовать функцию обратного вызова, обещание или асинхронную функцию. Однако, поскольку это для соединения MySQL, вы должны использовать пул соединений .

В вашем database.js -файле:

const mysql = require("promise-mysql");
const config = require("../config");

module.exports = mysql.createPool(config.MYSQL);

Вам не нужны никакие изменения кода в остальной части кода.

В качестве альтернативы вы можете использовать mysql2 вместо promise-mysql (на основе mysql), поскольку он предлагает множество полезных функций, , перечисленных в их файле readme .

Ваш код потребует очень небольших изменений, npm i -S mysql2 или yarn add mysql2, с последующим изменением строки require("promise-mysql") на require("mysql2/promise") в вашем database.js -файле. Возможно обновление конфигурации в вашем config.js для соответствия дополнительным параметрам, которые вы можете использовать для пула соединений. В противном случае mysql2 в значительной степени совместим с API с mysql.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...