Javascript Can';在节点js中提交表单后加载CSS文件

Javascript Can';在节点js中提交表单后加载CSS文件,javascript,css,node.js,Javascript,Css,Node.js,让我先详细介绍一下。我使用node的NodeEmailer从表单上提交的信息发送电子邮件。当我有一个接收者和一个html正文(一次发送所有内容)时,一切正常。但是,当我将mailpoptions2放入for循环中时,我就能够使用不同数组中的收件人和html正文发送电子邮件。然后它仍然以我想要的方式发送电子邮件和html内容。但是当表单提交时,在/send状态下,它会继续加载,最后只加载页面的原始html,而不加载css。我得到这个错误: Error: Can't set headers afte

让我先详细介绍一下。我使用node的NodeEmailer从表单上提交的信息发送电子邮件。当我有一个接收者和一个html正文(一次发送所有内容)时,一切正常。但是,当我将
mailpoptions2
放入
for
循环中时,我就能够使用不同数组中的收件人和html正文发送电子邮件。然后它仍然以我想要的方式发送电子邮件和html内容。但是当表单提交时,在
/send
状态下,它会继续加载,最后只加载页面的原始html,而不加载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', 'xyz@gmail.com'];
  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: 'xyz@gmail.com', // 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" <xyz@info.com>', // 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'});
    });
  }
});

您不能多次调用
res.render()
,因为
res.render
会将编译好的html发送到客户端。因此,只有在希望向客户端发送最终响应时,才需要调用
res.render

在这种情况下,您可以使用Promise管理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);
    })

您不能多次调用
res.render()
,因为
res.render
会将编译好的html发送到客户端。因此,只有在希望向客户端发送最终响应时,才需要调用
res.render

在这种情况下,您可以使用Promise管理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);
    })

当你发送一个发送电子邮件的post请求时,你是否试图让用户停留在一个页面上?在post请求之后,是否要更改页面的样式?尝试更新你的问题,以便更清楚地表明你正在努力实现的目标。您可以将您的样式添加到页面中,在使用
.form sent
发送表单后应用的样式之前添加这些样式,然后将
.form sent
类添加到表单帖子的顶部标签(如正文)中……我不想更改任何内容,只想保持不变。因为表单提交后,当页面加载时,它只是原始html,因为它不加载css文件@DuhaiMea当你发送一个发送电子邮件的post请求时,你是否试图让用户停留在一个页面上?在post请求之后,是否要更改页面的样式?尝试更新你的问题,以便更清楚地表明你正在努力实现的目标。您可以将您的样式添加到页面中,在使用
.form sent
发送表单后应用的样式之前添加这些样式,然后将
.form sent
类添加到表单帖子的顶部标签(如正文)中……我不想更改任何内容,只想保持不变。因为表单提交后,当页面加载时,它只是原始html,因为它不加载css文件@你能用代码演示一下吗?我不太确定我如何实现它。是的,当然,我正在努力,我会尽快发布一个解决方案。你能用代码演示一下吗?不太确定我如何实现。是的,当然,我正在努力,我很快就会发布解决方案