2017-09-22 11 views
0

私は私のものではないWebアプリケーションで処理していますが、今では100個の電子メールを送信する必要があります。ノード経由でルータのJavaScriptファイル内の関数にアクセスするにはどうすればよいですか?

残念ながら、コードは文書化されておらず、あまりよく書かれていないので、私はそれをテストして私ができることと私がしていないことを発見しなければならないということです。しかし、私はノード経由でコード上にあるこの関数にアクセスする方法を知らない。それを実際に行うことは可能ですか?ここでは、コードです:

router.post('/aprovadosemail', miPermiso("3"), (req, res) => { 
    var templatesDir = path.resolve(__dirname, '..', 'templates'); 
    var emailTemplates = require('email-templates'); 

    // Prepare nodemailer transport object 

    emailTemplates(templatesDir, function(err, template) { 

    if (err) { 
     console.log(err); 
    } else { 

     var users = []; 

     projetoSchema.find({"aprovado":true, "categoria":"Fundamental II (6º ao 9º anos)"}, function (err, docs) { 
     if (err) throw err; 
     //console.log(docs); 
     docs.forEach(function(usr) { 
      let url = "http://www.movaci.com.b/projetos/confirma/"+usr._id+"/2456"; 
      let url2 = "http://www.movaci.com.br/projetos/confirma/"+usr._id+"/9877"; 
      users.push({'email': usr.email, 'projeto': usr.nomeProjeto, 'url': url, 'url2': url2}); 
     }); 
     for (var i = 0; i < users.length; i++) { 
      console.log(users[i]); 
     } 

     const transporter = nodemailer.createTransport(smtpTransport({ 
      host: 'smtp.zoho.com', 
      port: 587, 
      auth: { 
      user: "[email protected]", 
      pass: "genericpassword" 
      }, 
      getSocket: true 
     })); 

     var Render = function(locals) { 
      this.locals = locals; 
      this.send = function(err, html, text) { 
      if (err) { 
       console.log(err); 
      } else { 

       transporter.sendMail({ 
       from: '[email protected]', 
       to: locals.email, 
       subject: 'MOVACI - Projeto aprovado!', 
       html: html, 
       text: text 

       }, function(err, responseStatus) { 
       if (err) { 
        console.log(err); 
       } else { 
        console.log(responseStatus.message); 
       } 
       }); 
      } 
      }; 
      this.batch = function(batch) { 
      batch(this.locals, templatesDir, this.send); 
      }; 
     }; 

     // Load the template and send the emails 
     template('rateada', true, function(err, batch) { 
      for(var user in users) { 
      var render = new Render(users[user]); 
      render.batch(batch); 
      }; 
     }); 
     res.send('ok'); 
     }); 
    }; 
    }); 
}); 
+0

開発者異なるコード部分を別々の機能に移動する必要があります。ルートハンドラの内部で呼び出すだけです。 – num8er

答えて

0

は、以前のDEVは(少なくともそれがどのように動作するか読んでいない)深くemail-templatesパッケージを知っていなかったように思えます。だから、実際にはメソッドを送ってい

、あなたはその後、あなたは動的部品を渡すことによって、その.sendメソッドを呼び出し、email-templatesから電子メールオブジェクトを作成し、必要なデフォルト値を渡すことができます - それは単に送信引数に渡された追加のparamsをマージし、メールを送信それが返す約束の中にnodemailerを使って。それはあなたのために興味深いの場合

- それのソースコードを読む:https://github.com/niftylettuce/email-templates/blob/master/index.js



私はそれを約束を使用してモジュラー部品を簡素化しようとしました。

私はそれをデバッグしていませんが、私のソリューションをチェックして、あなたが望むように修正するかもしれません。使用する部品をルーティングところ、現在のルートがファイル

const 
    Email = require('email-templates'), 

const 
    emailTemplatesDir = path.resolve(__dirname + '/../../templates'), 
    smtpTransportConfig = { 
     host: 'smtp.zoho.com', 
     port: 587, 
     secure: false, 
     auth: { 
      user: "[email protected]", 
      pass: "some-password-here" 
     } 
    }, 
    createEmail = (template, subject) => { 
     return new Email({ 
      views: { 
       root: emailTemplatesDir, 
      }, 
      transport: smtpTransportConfig, 
      template, 
      message: { 
       from: '[email protected]', 
       subject 
      } 
     }); 
    }, 
    getApprovedUsers =() => { 
     return new Promise((resolve, reject) => { 
      const criteria = { 
       aprovado: true, 
       categoria:"Fundamental II (6º ao 9º anos)" 
      }; 
      projetoSchema.find(
       criteria, 
       (error, docs) => { 
        if(error) return reject(error); 
        const users = docs.map(doc => { 
         return { 
          email: doc.email, 
          projeto: doc.nomeProjeto, 
          url: "http://www.movaci.com.b/projetos/confirma/"+doc._id+"/2456", 
          url2: "http://www.movaci.com.br/projetos/confirma/"+doc._id+"/9877" 
         }; 
        }); 
        resolve(users); 
       }); 
     }); 
    }, 
    sendMailToUser = (mail, user) => { 
     return mail.send({ 
      message: { 
       to: user.email 
      }, 
      locals: user 
     }); 
    }, 
    broadcastMailToUsers = (mail, users) => { 
     return Promise 
       .all(
        users 
         .map(user => sendMailToUser(mail, user)) 
       ); 
    }; 

module.exports = (req, res) => { 
    const mail = createEmail('rateada', 'MOVACI - Projeto aprovado!'); // mail object 
    getApprovedUsers() 
     .then(users => broadcastMailToUsers(mail, users)) 
     .then(result => { 
      console.log('Result of broadcast:', result); 
      res.send('ok'); 
     }) 
     .catch(error => { 
      res.status(500).send(error); 
     }); 
}; 

2):

1)methods/users/aprovadosEmail.js

は、2つのファイル(別途ハンドラからのルーティングに、それは競合となども変数を持つことを)持っていますモジュールファイル:

router.post(
    '/aprovadosemail', 
    miPermiso("3"), 
    require(__dirname+'/../methods/users/aprovadosEmail') 
); 
+0

母、ありがとう、それは働いた。 – innis

関連する問題