首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >导出动态变量

导出动态变量
EN

Stack Overflow用户
提问于 2018-09-30 06:40:12
回答 1查看 770关注 0票数 1

我尝试在node.js中导出一个变量,如下所示:

代码语言:javascript
复制
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;

当我在其他模块中使用此代码时,如下所示:

代码语言:javascript
复制
const news = require('./news.js').news;

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

有人能指出我在第一个代码中的错误吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-30 07:34:22

在你这样做的方式中,有几件事看起来很奇怪:

您有一个异步操作,但您只想要该值,而不实际等待该操作完成。尝试如下所示:

代码语言:javascript
复制
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)));
  });
});

然后,为了得到消息:

代码语言:javascript
复制
var getNewsAsync = require('./news')
getNewsAsync.then(news => console.log(news))

如果您在mysql库中实际使用异步/等待,则会更干净/更短。

更新

使用Node 8 and above you should be able to promisifymySQL库方法。尽管可能会有更好的npm选项来实现这一点。这是一个未经测试的版本:

代码语言:javascript
复制
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()}
}

要获取新闻:

代码语言:javascript
复制
var getNewsAsync = require('./news')
console.log(await getNewsAsync())
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52573129

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档