如何从ES6中的parsing器中获得xml2js结果?

我正在Node中构build一个服务器,它将search一个文件夹以查看XML文件是否存在(glob),如果存在,请将(fs)中的文件作为JSON对象(xml2js)读取,并最终将其存储在数据库中某处。 我想要得到分析器的结果OUT到另一个variables,所以我可以用数据做其他事情。 据我所知,有些东西是同步运行的,但是我不知道如何阻止它,并且让我等待,直到它完成继续前进。

我将我的function从app.js分离到其他地方的控制器:

app.controller.js

const fs = require('fs-extra'); const glob = require('glob'); const xml2js = require('xml2js'); exports.requests = {}; exports.checkFileDrop = async () => { console.log('Checking for xml in filedrop...'); // this is the only place await works... await glob('./filedrop/ALLREQUESTS-*.xml', (err, files) => { var parser = new xml2js.Parser(); // this is looking for a specific file now, which I'll address later once I can figure out this issue fs.readFile('./filedrop/ALLREQUESTS-20170707.xml', 'utf16le', function (err, data) { if (err) { console.log('ERROR: ', err); } else { parser.parseString(data, (err, result) => { if (err) { console.log('ERROR: ', err); } else { console.log('data found'); exports.requests = JSON.stringify(result.Records.Record); // data is outputted here correctly console.log(exports.requests); // this doesn't even seem to want to save to exports.requests anyways... } }); } }); }); } 

app.js

 const appController = require('./controllers/app.controller'); // check if there is file in filedrop appController.checkFileDrop(); // prints out an empty object console.log(appController.requests); // can't do anything if it doesn't exist yet appController.saveToDB(appController.requests); 

await会等待一个Promise价值来解决,否则它只会包装它承诺的价值并立即解决承诺。 在你的例子中,

 await glob('./filedrop/ALLREQUESTS-*.xml', (err, files) => { 

glob的调用不返回一个Promise ,所以await实质上是无用的。 所以你需要自己创造承诺。

 exports.checkFileDrop = async () => { console.log('Checking for xml in filedrop...'); const files = await new Promise((resolve, reject) => glob('./filedrop/ALLREQUESTS-*.xml', (err, files) => { if (err) reject(err); else resolve(files); }); const parser = new xml2js.Parser(); const data = await new Promise((resolve, reject) => fs.readFile('./filedrop/ALLREQUESTS-20170707.xml', 'utf16le', function (err, data) { if (err) reject(err); else resolve(data); }); const result = await new Promise((resolve, reject) => parser.parseString(data, (err, result) => { if (err) reject(err); else resolve(result); }); console.log('data found'); const requests = JSON.stringify(result.Records.Record); console.log(requests); } 

请注意,现在这个函数会拒绝它返回的promise,而不是强制logging错误。

你也可以用帮手来压缩这个。 例如,节点8包含util.promisify以使得这样的代码更容易编写,例如

 const util = require('util'); exports.checkFileDrop = async () => { console.log('Checking for xml in filedrop...'); const files = await util.promisify(glob)('./filedrop/ALLREQUESTS-*.xml'); const parser = new xml2js.Parser(); const data = await util.promisify(fs.readFile)('./filedrop/ALLREQUESTS-20170707.xml', 'utf16le'); const result = await util.promisify(parser.parseString.bind(parser))(data); console.log('data found'); const requests = JSON.stringify(result.Records.Record); console.log(requests); }