我正在使用nodejs,我想向客户端发回多个回复。我的代码在下面
// addwork
var agenda = require('../../schedules/job-schedule.js')(config.db);
exports.addwork = function(req, res) {
var work = new Work(req.body);
work.user = req.user._id;
var user=req.user;
work.save(function(err) {
if (err) {
return res.status(400).send({
message: errorHandler.getErrorMessage(err)
});
} else {
console.log('created work....'+work);
console.log('dateeeeeeeeeeeee'+work.created);
console.log('calling agenda job now, user is: '+ JSON.stringify(req.user));
console.log('supervisor-------------------------'+JSON.stringify(user.supervisor));
agenda.now('Work_To_Supervisior_Notify', {supervisor:user.supervisor,title:work.title,details:work.details});
res.jsonp(work);
res.send({message:'An email has been sent to ' + user.supervisor + ' with further instructions.'});
}
});
};`
//作业schedule.js
var Agenda = require("agenda");
var emailJob = require('./jobs/email-job.js');
module.exports = function(agendaDb) {
var agenda = new Agenda({db: { address: agendaDb}});
emailJob.sendWorkToSupervisiorEmail(agenda);
agenda.start();
return agenda;
}
//电子邮件-job.js
exports.sendWorkToSupervisiorEmail = function(agenda){
agenda.define('Work_To_Supervisior_Notify',{priority: 'high', concurrency: 10}, function(job, done){
console.log('Send works to supervisior ' + JSON.stringify(job.attrs.data.supervisor)+' ,title '+job.attrs.data.title+' ,details '+job.attrs.data.details);
var smtpTransport = nodemailer.createTransport(config.mailer.options);
var mailOptions = {
to: job.attrs.data.supervisor,
from: config.mailer.from,
subject: 'work done by user',
html: '<b>work title : '+job.attrs.data.title+' <br/>work details : '+job.attrs.data.details+'</b>'
};
smtpTransport.sendMail(mailOptions, function(err) {
if (!err) {
console.log('An email has been sent to ' + job.attrs.data.supervisor + ' with further instructions.');
res.send({message:'An email has been sent to ' + user.supervisor + ' with further instructions.'});
}
});
done();
})
}
这里我想要来自议程或来自addwork函数中的res.send()消息 如果我在addwork函数中使用res.send,则显示ERROR为&#34;在发送&#34;后不能设置标题。如果我在sendWorkToSupervisiorEmail()中使用res.send消息,则显示ERROR为&#34 ;没有方法发送&#34;。我是nodejs的新手,请帮我解决方案
答案 0 :(得分:4)
http请求只获得一个http响应。使用http,您只能获得一个响应。一些选项:
1)在回复之前等待一切完成。确保每个部分创建结果,成功或失败,并立即发送多个响应。您需要一些控制流库,例如async或Promises,以确保所有内容同时响应。如果所有部件都“快速”发生,那么这是一个很好的选择,如果您的用户等待“太长时间”响应则不太好。 (这些术语在引号中,因为它们取决于应用程序。)
2)创建一些方案,其中第一个响应告诉等待多少其他响应。然后,您将有一个不同的HTTP请求,要求提供第一个附加消息,当它返回到您的客户端时,请求第二个附加消息,依此类推。这是很多协调,因为你必须缓存响应,或者如果还没有完成再试一次。使用像redis(或类似的)一样的内存缓存可以满足在准备好之前保持响应的需要,并且不存在意义“未准备好”
3)使用可以推送来自服务器的消息的事件协议,例如WebSockets。这是一个不错的选择,特别是如果您不知道触发后某些事件会发生多长时间。 (您不希望停止HTTP请求几十秒等待3个部分完成 - 用户将感到无聊,或退出或重新提交。)。绝对查看Primus库以获取此选项。它甚至可以提供客户端脚本,这使得集成变得快速而简单。