async.waterfall: Ошибка: обратный вызов уже был вызван без зацикливания - PullRequest
0 голосов
/ 27 августа 2018

У меня проблема с NodeJS Async.js при вызове обратного вызова done(). Он говорит мне "Обратный звонок уже был вызван" .

Вот ошибка:

node_modules/async/dist/async.js:966
        if (fn === null) throw new Error("Callback was already called.");
                         ^

Error: Callback was already called.
    at /Users/lilianbideau/NodeDashboard/NodeJSAPI/node_modules/async/dist/async.js:966:32
    at /Users/lilianbideau/NodeDashboard/NodeJSAPI/dist/server/api/order/order.controller.js:245:23
    at tryRender (/Users/lilianbideau/NodeDashboard/NodeJSAPI/node_modules/express/lib/application.js:642:5)
    at Function.render (/Users/lilianbideau/NodeDashboard/NodeJSAPI/node_modules/express/lib/application.js:592:3)
    at ServerResponse.render (/Users/lilianbideau/NodeDashboard/NodeJSAPI/node_modules/express/lib/response.js:1008:7)
    at myThirdFunction (/Users/lilianbideau/NodeDashboard/NodeJSAPI/dist/server/api/order/order.controller.js:240:7)
    at nextTask (/Users/lilianbideau/NodeDashboard/NodeJSAPI/node_modules/async/dist/async.js:5324:14)
    at next (/Users/lilianbideau/NodeDashboard/NodeJSAPI/node_modules/async/dist/async.js:5331:9)
    at /Users/lilianbideau/NodeDashboard/NodeJSAPI/node_modules/async/dist/async.js:969:16
    at mySecondFunction (/Users/lilianbideau/NodeDashboard/NodeJSAPI/dist/server/api/order/order.controller.js:232:10)
    at nextTask (/Users/lilianbideau/NodeDashboard/NodeJSAPI/node_modules/async/dist/async.js:5324:14)
    at next (/Users/lilianbideau/NodeDashboard/NodeJSAPI/node_modules/async/dist/async.js:5331:9)
    at /Users/lilianbideau/NodeDashboard/NodeJSAPI/node_modules/async/dist/async.js:969:16
    at RandomBytes.ondone (/Users/lilianbideau/NodeDashboard/NodeJSAPI/dist/server/api/order/order.controller.js:226:12)
[nodemon] app crashed - waiting for file changes before starting...

Это должно работать, как я следовал за документом здесь: https://caolan.github.io/async/docs.html#waterfall

Вы можете видеть, что функция обратного вызова вызывается несколько раз, и я не использую цикл в функциях.

Вот код:

    function create(req, res) {
  var order = new _order2.default(req.body);
  order.user = req.user.id;
  var datedata = new Date();
  datedata = Date.now();
  order.userNotification.push({ 'status': 'Thank you for your order',
    'time': datedata });
  order.userNotification.push({ 'status': 'Waiting for your order to be processed.',
    'time': datedata });
  if (req.body.paymentOption == 'COD') {
    order.userNotification.push({ 'status': 'Awaiting confirmation from vendor.',
      'time': datedata });
  }
  order.paymentOption = req.body.paymentOption;
  order.save(function (err) {
    if (err) {
      res.status(400).send({
        message: 'order couldn\'t placed.'
      });
    } else {
      async.waterfall([      
        myFirstFunction,
        mySecondFunction,
        myThirdFunction,
        myLastFunction,
      ], function (err) {
        if (err) {
          return next(err);
        }
      });
    }
  });
  //---------------------------test function async.waterflow --------------------------//
  function myFirstFunction(done) {
    // Generate random token
    crypto.randomBytes(20, function (err, buffer) {
      var token = buffer.toString('hex');
      return done(err, token);
    });
  }
  function mySecondFunction(token, done, err) {
    // Lookup user by username
    return done(err, token);
  }
  function myThirdFunction(token, done) {
     // If valid email, send reset email using service
    var httpTransport = 'http://';
    if (_environment2.default.secure && _environment2.default.secure.ssl === true) {
      httpTransport = 'https://';
    }
    res.render(path.resolve('server/components/orderStatus/orderrequested'), {
      email: req.user.email,
      name: req.user.name,
      appName: 'Restaurant App'
    }, function (err, emailHTML) {
      return done(err, emailHTML);
    });
  }
  function myLastFunction(emailHTML, done) {
    var mailOptions = {
      to: req.user.email,
      from: 'info@impnolife.org',
      subject: 'Thank you for your order.',
      html: emailHTML
    };
    mailgun.messages().send(mailOptions, function (err) {
      if (!err) {
        res.json(order);
      } else {
        return res.status(400).send({
          message: 'Failure sending email'
        });
      }
    });
  }
//---------------------------test function async.waterflow END--------------------------//
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...