Ошибка типа: app.post (...). Тогда это не функция - PullRequest
0 голосов
/ 22 мая 2018

У меня проблемы с маршрутами API в узле приложения.Я переключил «на» часть моего Nodemailer, и теперь он внезапно вызывает у меня проблемы с Async в моем «Post» Action.

Я получаю сообщение об ошибке: 'TypeError: app.post (...). Тогда это не функция'

Вот код:

app.post("/api/applicants", function(req, res) {
  db.Applicant.create(req.body);
  res.send('Successfully posted new Applicant');       
  }).then(function(appPost){
      //mail details for nodemailer
      let mailOptions = {
          from: '"noreply@cap.org" <app@cap.org>', // sender address
          to: 'ijvv7dth54f7zp3w@ethereal.email', // list of receivers
          subject: 'Application Submitted', // Subject line
          text: req.body.firstname + ' ' + req.body.last_name + ' just sent you a message!', // plain text body
          html: '<b>'+req.body.first_name+'</b>' + '</br>' +
          ''  + req.body.last_name   + '</br>' + 
          'DOB: ' 
           // html body
      };
      transporter.sendMail(mailOptions, (error, info) => {
          if (error) {
              return console.log(error);
          }
          console.log('Message sent: %s', info.messageId);
          // Preview only available when sending through an Ethereal account
          console.log('Preview URL: %s', nodemailer.getTestMessageUrl(info));
          // Message sent: <b658f8ca-6296-ccf4-8306-87d57a0b4321@blurdybloop.com>
          // Preview URL: https://ethereal.email/message/WaQKMgKddxQDoou...
      }); 
   });

1 Ответ

0 голосов
/ 22 мая 2018

Кажется, вы подключили обработчик обещаний .then к app.post.app.post предоставляется Express и не возвращает обещание, вместо этого он использует функцию-обработчик.

Похоже, что вы действительно намеревались получить обещание из db.Applicant.create.В этом случае вам нужно будет взять ваше .then обещание и поставить его в соответствии с db.Applicant.create следующим образом.

app.post("/api/applicants", function(req, res) {
  return db.Applicant.create(req.body).then(function(appPost){
    // Respond to the HTTP request
    res.send('Successfully posted new Applicant');
    res.end(); // Ensure the response is sent before any emailing is attempted

    //mail details for nodemailer
    let mailOptions = {
      from: '"noreply@cap.org" <app@cap.org>', // sender address
      to: 'ijvv7dth54f7zp3w@ethereal.email', // list of receivers
      subject: 'Application Submitted', // Subject line
      text: req.body.firstname + ' ' + req.body.last_name + ' just sent you a message!', // plain text body
      html: '<b>'+req.body.first_name+'</b>' + '</br>' +
      ''  + req.body.last_name   + '</br>' +
      'DOB: '
      // html body
    };
    transporter.sendMail(mailOptions, (error, info) => {
      if (error) {
        return console.log(error);
      }
      console.log('Message sent: %s', info.messageId);
      // Preview only available when sending through an Ethereal account
      console.log('Preview URL: %s', nodemailer.getTestMessageUrl(info));
      // Message sent: <b658f8ca-6296-ccf4-8306-87d57a0b4321@blurdybloop.com>
      // Preview URL: https://ethereal.email/message/WaQKMgKddxQDoou...
    });
  });
});

В этом случае я предполагаю, что db.Applicant.create возвращает обещание,хотя невозможно знать наверняка, не зная пакетов, которые вы используете.Кроме того, обратите внимание, что я добавил «res.end ()», который закрывает HTTP-ответ перед попыткой ввода кода электронной почты, это необязательно, но он должен гарантировать, что клиент получит ответ до обработки электронного письма.Вы можете или не хотите делать это также.

...