2017-12-04 9 views
0

最初に詳細を教えてください。私はノードのノードメーラーを使ってフォーム上の送信された情報から電子メールを送信します。一度に一人の受信者と一人のHTML本体が送信されたとき、うまくいきました。しかし、mailOptions2forループに入れると、異なる配列の受信者とhtmlボディで電子メールを送信できます。それから、私は望みどおりに電子メールとhtmlの内容を別々に送信します。しかし、フォームが提出されると、/send州ではロードが維持され、ページの生のHTML、つまりCSSはロードされません。ノードjsにフォームがサブミットされた後にCSSファイルをロードできません

Error: Can't set headers after they are sent. 
    at validateHeader (_http_outgoing.js:489:11) 
    at ServerResponse.setHeader (_http_outgoing.js:496:3) 
    at ServerResponse.header (C:\Users\Ahmet Ömer\Desktop\Repairtechnician\node_modules\express\lib\response.js:767:10) 
    at ServerResponse.send (C:\Users\Ahmet Ömer\Desktop\Repairtechnician\node_modules\express\lib\response.js:170:12) 
    at done (C:\Users\Ahmet Ömer\Desktop\Repairtechnician\node_modules\express\lib\response.js:1004:10) 
    at Immediate._onImmediate (C:\Users\Ahmet Ömer\Desktop\Repairtechnician\node_modules\express-handlebars\lib\utils.js:26:13) 
    at runCallback (timers.js:781:20) 
    at tryOnImmediate (timers.js:743:5) 
    at processImmediate [as _immediateCallback] (timers.js:714:5) 

このエラーの原因はわかっていますが、私はかなり初心者ですから、私の場合はそれを解決する方法がわかりませんでした。

Nodejs:

app2.engine('handlebars', exphbs2()); 
app2.set('view engine', 'handlebars'); 

// Static folder 
app2.use('/public', express2.static(path2.join(__dirname, 'public'))); 
app2.use('/', express2.static(path2.join(__dirname, ''))); 

// Body Parser Middleware 
app2.use(bodyParser2.urlencoded({ extended: false })); 
app2.use(bodyParser2.json()); 

app2.get('/', (req, res) => { 
    res.render('services'); 
}); 

app2.post('/send', (req, res) => { 
    let mailList = ['xyz', '[email protected]']; 
    let outputs = [ 
    ` 
    <div> 
    </div> 
    `, 
    ` 
    <div> 
    </div> 
`]; 

    // create reusable transporter object using the default SMTP transport 
    let transporter2 = nodemailer2.createTransport({ 
    service: 'gmail', 
    port: 25, 
    secure: false, 
    auth: { 
     user: '[email protected]', // senders email 
     pass: 'xyz' // senders password 
    }, 
    tls:{ 
     rejectUnauthorized:false 
    } 
    }); 

    for (var i = 0; i < mailList.length; i++) { 
     // setup email data with raw html 
     let mailOptions2 = { 
     from: '"xyz" <[email protected]>', // sender address 
     to: mailList[i], // receiver or receivers 
     subject: 'xyz', // Subject line 
     html: outputs[i] // html body 
    }; 

     // send mail with defined transport object 
     transporter2.sendMail(mailOptions2, (error, info) => { 
     if (error) { 
      return console.log(error); 
     } 
     console.log('Message sent: %s', info.messageId); 
     console.log('Preview URL: %s', nodemailer2.getTestMessageUrl(info)); 

     res.render('services', {msg2:'xyz'}); 
    }); 
    } 
}); 

私が言ったように、私が指定した領域に異なる値を渡すためにmailOptions2ためforループを使用していなかった場合、それがうまく働いてきたでしょう。役立つ可能性がある場合はここで

は、上記のファイルの私の構造です:

server.js 
services.html 
public 
    css 
     styles.css 
+0

あなたは電子メールを送信したPOSTリクエストを送信しながら、1つのページにユーザーを維持しようとしていますか?ポストリクエストの後に、ページのスタイルを変更したいですか?あなたが達成しようとしていることをより明確に示すために質問を更新してみてください。ページにスタイルを追加するだけで、フォームが '.form-sent'で送信された後に適用されるスタイルを記述し、' .form-sent'クラスをPOSTのトップタグ(bodyのような)に追加することができますフォーム... – duhaime

+0

私は何も変えたくない、同じままにしておきたい。フォームが提出された後、ページが読み込まれると、cssファイルがロードされないため、生のhtmlだけが読み込まれるためです。 @duhaime –

答えて

3

res.renderがクライアントにコンパイルされたHTMLを送信するためにあなたがres.render()複数の時間を呼び出すことはできません。したがって、最終応答をクライアントに送信する場合にのみres.renderに電話する必要があります。あなたはsendmailのコールバックを管理するための約束を使用することができます。このケースでは

// init this array outside the for loop 
let sendMailPromises = []; 

// this is inside the for loop 
let promise = new Promise((resolve, reject) => { 
    transporter2.sendMail(mailOptions2, (err, infos) => { 
     if(err) reject(err) 

     console.log('Mail sent %s', info.messageId); 
     console.info('Preview URL: %s', nodeMailer2.getTest(info)); 
     resolve(infos) 
    }); 

}); 
sendMailPromises.push(promise); 

// this is after (and outside) the for loop. 
Promise.all(sendMailPromises) 
    .then(() => { 
     res.render(mailOptions, {msg2: '...'}) 
    }).catch((err) => { 
     console.error(err); 
    }) 
+0

コードでそれを実証できますか?どのように私がそれを実装することができますかかなりわからない。 –

+0

はい、確かに、私はそれに取り組み、すぐに解決策を投稿します –

関連する問題