【问题标题】:failing to get output from function无法从函数中获取输出
【发布时间】:2017-09-03 18:05:46
【问题描述】:

我试图弄清楚如何从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); }

但我得到一个错误: '缺少必需的标题'To'。'

【问题讨论】:

    标签: node.js xml2js


    【解决方案1】:

    您没有打印数据的值,而是打印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);
        }
      });
    });
    

    【讨论】:

    • 我正在尝试将返回值发送到 nodemailer transporter.sendMail({ from: 'mail@mail.com', to: document(sourceFile, (data) =&gt; data), subject: 'Message', text: 'I hope this message gets sent!', }, (err, info) =&gt; { if (err) { console.log('error!'); console.log(err.message); } else { console.log('sucess!'); console.log(info.messageId); console.log(info.response); } ,但这是我得到的错误:'缺少必需的标头'To'。'
    • @KarolisArbačiauskas,请为相同的问题添加更新,将更新我的答案。所以问题答案保持同步。
    • @KarolisArbačiauskas 我已经添加了更新补丁来回答。
    • 谢谢!像魅力一样工作。请您解释一下,为什么我需要将 sendmail 函数移动到回调?
    • 您必须了解callbacksasync 和类似内容的工作原理。你犯了几个错误。首先,您以一种将返回值的方式调用函数,但该值与回调一起出现,因为它是异步操作。其次,您没有等待回调触发以进一步执行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-05
    • 1970-01-01
    • 2021-08-11
    • 1970-01-01
    相关资源
    最近更新 更多