Javascript Can';在节点js中提交表单后加载CSS文件
让我先详细介绍一下。我使用node的NodeEmailer从表单上提交的信息发送电子邮件。当我有一个接收者和一个html正文(一次发送所有内容)时,一切正常。但是,当我将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
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文件@你能用代码演示一下吗?我不太确定我如何实现它。是的,当然,我正在努力,我会尽快发布一个解决方案。你能用代码演示一下吗?不太确定我如何实现。是的,当然,我正在努力,我很快就会发布解决方案