我试图在nodejs中创建一个转换模块,将xml文件转换为js对象。
这是我的XML文件:
<?xml version="1.0" encoding="utf-8"?>
<translation>
<title>This is a title</title>
</translation>
这是我的模块:
const xmlJS = require('xml-js');
const fs = require('fs');
let translation = '';
// convert xml to json to js object
fs.readFile( './translation.xml', function(err, data) {
if (err) throw err;
let convert = xmlJS.xml2json(data, {compact: true, spaces: 2});
let parse = JSON.parse(convert).translation;
translation = parse.en;
});
// wait until export, i have to do this cuz converting xml take like 1sec on my computer,
// so if i'm not waiting before the export my module will return me a blank object.
function canIExport() {
if (translation === '') {
setTimeout(() => {
canIExport();
}, 500);
} else {
exports.translation = translation;
}
}
canIExport();
在我的app.js中:
const translation = require('./translation');
这里是我的问题,当我试图调用
translation
对象中的一些文本时我得做点什么:
translation.translation.title._text
。我必须做
translation.translation
,因为我的exports.translation = translation
把我的var放在翻译的子对象中(有点像inception)。那么,如何避免这种情况,而只是做一些类似于
translation.title._text
的事情呢? 最佳答案
这是xy问题。导出对象的异步修改是一个反模式。这将导致比赛条件。
模块导出应完全同步:
const fs = require('fs');
const data = fs.readFileSync( './translation.xml');
...
module.exports = translation;
或者模块应该导出一个承诺:
const fs = require('fs').promises;
module.exports = fs.readFile( './translation.xml')
.then(data => ...);
并以此方式使用:
const translationPromise = require('./translation');
translationPromise.then(translation => ...);
关于node.js - 导出模块而不命名,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54074084/