Dev*_*wal 0 node.js promise node-modules
我正在尝试在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;
Run Code Online (Sandbox Code Playgroud)
当我在其他模块中使用此代码时,如下所示:
const news = require('./news.js').news;
console.log(news);
//returns [];
Run Code Online (Sandbox Code Playgroud)
有人可以在第一段代码中指出我的错误吗?
你做这件事的方式有几个看起来很奇怪:
您有一个异步操作,但您只想要该值而不实际等待操作完成.尝试这样的事情:
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)));
});
});
Run Code Online (Sandbox Code Playgroud)
然后得到消息:
var getNewsAsync = require('./news')
getNewsAsync.then(news => console.log(news))
Run Code Online (Sandbox Code Playgroud)
如果您实际使用mysqllib的async/await,它会更干净/更短.
更新:
随着节点8及以上,你应该能够promisify的mySQLLIB方法.虽然可能有更好的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()}
}
Run Code Online (Sandbox Code Playgroud)
得到消息:
var getNewsAsync = require('./news')
console.log(await getNewsAsync())
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
216 次 |
| 最近记录: |