无法从函数获取输出
我想弄清楚如何从xml
文件获得价值,并输出该值到控制台。
const path = require('path'); const fs = require('fs'); const parseString = require('xml2js').parseString; const sourceFile = path.join(__dirname, 'books.xml'); const document = (sourceFile, callback) => { fs.readFile(sourceFile, { encoding: 'utf-8' }, function (err, data) { if (err) { return err; } parseString(data, (err, result) => { result.catalog.book.forEach(users => { callback(users.email); }); }); }); }; console.log(document(sourceFile, data => data));
XML本身很简单:
<catalog> <book id="bk101"> <author>Gambardella, Matthew</author> <title>XML Developer's Guide</title> <email>test@test.com</email> </book> </catalog>
但是我从函数中得到的是undefined
。 为什么会发生?
更新:我试图发送返回值给nodemailer
transporter.sendMail({ from: 'mail@mail.com', to: document(sourceFile, (data) => data), subject: 'Message', text: 'I hope this message gets sent!', }, (err, info) => { if (err) { console.log('error!'); console.log(err.message); } else { console.log('sucess!'); console.log(info.messageId); console.log(info.response); }
但我得到一个错误:'缺less所需的标题'为'。'
您不打印数据的值,而是打印document
函数的返回值(它不返回任何内容,因此undefined
)。
我已经修改了代码,所以现在它会按照你的意愿工作,
const path = require('path'); const fs = require('fs'); const parseString = require('xml2js').parseString; const sourceFile = path.join(__dirname, 'books.xml'); const document = (sourceFile, callback) => { fs.readFile(sourceFile, { encoding: 'utf-8' }, function (err, data) { if (err) { return err; } parseString(data, (err, result) => { result.catalog.book.forEach(users => { callback(users.email); }); }); }); }; document(sourceFile, data => console.log(data));
更新:根据OP的评论,
const path = require('path'); const fs = require('fs'); const parseString = require('xml2js').parseString; const sourceFile = path.join(__dirname, 'books.xml'); const document = (sourceFile, callback) => { fs.readFile(sourceFile, { encoding: 'utf-8' }, function (err, data) { if (err) { return err; } parseString(data, (err, result) => { result.catalog.book.forEach(users => { callback(users.email); }); }); }); }; document(sourceFile, data => { transporter.sendMail({ from: 'mail@mail.com', to: data, subject: 'Message', text: 'I hope this message gets sent!', }, (err, info) => { if (err) { console.log('error!'); console.log(err.message); } else { console.log('sucess!'); console.log(info.messageId); console.log(info.response); } }); });