sru*_*ran 1 node.js express angularjs
我正在使用nodejs,我想向客户端发回多个响应。我的代码如下
//添加工作
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.'});
}
});
};`
Run Code Online (Sandbox Code Playgroud)
//job-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;
}
Run Code Online (Sandbox Code Playgroud)
//电子邮件作业.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();
})
}
Run Code Online (Sandbox Code Playgroud)
在这里,我想要来自 addwork 函数中的议程或 res.send() 消息的响应如果我在 addwork 函数中使用 res.send ,它会显示错误为“发送后无法设置标头”。如果我使用 res.send 消息在 sendWorkToSupervisiorEmail() 中,它显示错误为“没有方法发送”。我是 Nodejs 新手,请帮助我解决方案
一个 http 请求只能得到一个 http 响应。使用 http,您只能得到一个响应。为您提供一些选择:
1)等待一切完成后再回复。确保每个部分都会产生结果(成功或失败),并立即发送多个响应。您将需要一些控制流库,例如async或Promises,以确保所有内容同时响应。如果所有部分都会“快速”发生,那么这是一个不错的选择,如果您的用户等待响应“太长时间”,则不好。(这些术语用引号引起来,因为它们取决于应用程序)。
2)创建一些方案,其中第一个响应告诉要等待多少个其他响应。然后,您将有一个不同的 HTTP 请求,请求第一条附加消息,当该请求返回到您的客户端时,请求第二条附加消息,依此类推。不过,这需要大量的协调,因为您必须缓存响应,或者如果尚未完成则重试。使用像 redis (或类似的)这样的内存缓存可以满足保存响应直到准备好的需要,不存在的意思是“未准备好”
3) 使用可以从服务器推送消息的事件协议,例如 WebSockets 。这是一个不错的选择,特别是当您不知道触发后某些事件会发生多长时间时。(您不希望将 HTTP 请求拖延数十秒以等待 3 个部分完成 - 用户会感到无聊,或者退出,或者重新提交。)。一定要查看Primus库以获取此选项。它甚至可以为客户端脚本提供服务,这使得集成变得快速而简单。
| 归档时间: |
|
| 查看次数: |
3874 次 |
| 最近记录: |