Экспорт динамической переменной - PullRequest
0 голосов
/ 30 сентября 2018

Я пытаюсь экспортировать переменную в node.js следующим образом:

let news = [];

const fetchNews = new Promise ((resolve, reject) => {

  let query = 'SELECT id, name FROM news';

  mysql.query(query, [], (error, results) => {

    if (error)
      reject({error: `DB Error: ${error.code} (${error.sqlState})`})

    results = JSON.parse(JSON.stringify(results));

    news = results;

    resolve(results);

  });

});

if(!news.length)
  fetchNews
    .then(results => {news = results})
    .catch(err => {console.log('Unable to fetch news', err)});

exports.news = news;

Когда я использую этот код в каком-то другом модуле, подобном этому:

const news = require('./news.js').news;

console.log(news);
//returns [];

Может кто-нибудьуказать мою ошибку в первом коде?

1 Ответ

0 голосов
/ 30 сентября 2018

Есть несколько вещей, которые кажутся странными в том, как вы делаете это:

У вас есть асинхронная операция, но вы хотите просто получить значение, не ожидая завершения операции.Попробуйте что-то вроде этого:

module.exports = new Promise ((resolve, reject) => {
  mysql.query('SELECT id, name FROM news', (error, results) => {
    if (error)
      reject({error: `DB Error: ${error.code} (${error.sqlState})`})

    resolve(JSON.parse(JSON.stringify(results)));
  });
});

Затем, чтобы получить новости:

var getNewsAsync = require('./news')
getNewsAsync.then(news => console.log(news))

Было бы чище / короче, если бы вы фактически использовали async / await с mysql lib.

Обновление :

С Узлом 8 и выше вы сможете обещать методы mySQL lib.Хотя, возможно, есть лучшие варианты npm, чтобы это работало.Вот непроверенная версия:

const mysql = require('mysql');
const util = require('util');
const conn = mysql.createConnection({yourHOST/USER/PW/DB});
const query = util.promisify(conn.query).bind(conn);

module.exports = async () => {
  try {return await query('SELECT id, name FROM news')} finally {conn.end()}
}

Для получения новостей:

var getNewsAsync = require('./news')
console.log(await getNewsAsync())
...