我尝试在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 [];
有人能指出我在第一个代码中的错误吗?
发布于 2018-09-30 07:34:22
在你这样做的方式中,有几件事看起来很奇怪:
您有一个异步操作,但您只想要该值,而不实际等待该操作完成。尝试如下所示:
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))
如果您在mysql
库中实际使用异步/等待,则会更干净/更短。
更新
使用Node 8 and above you should be able to promisify的mySQL
库方法。尽管可能会有更好的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())
https://stackoverflow.com/questions/52573129
复制相似问题