gpt4 book ai didi

angularjs - 通过nodejs向客户端发送多个响应

转载 作者:太空宇宙 更新时间:2023-11-03 22:54:22 25 4
gpt4 key购买 nike

我正在使用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.'});

}
});
};`

//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;
}

//email-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 ,它会显示错误为“发送后无法设置 header ”。如果我在 sendWorkToSupervisiorEmail() 中使用 res.send 消息,它会显示错误为“没有方法发送”。我是Nodejs新手请帮我解决问题

最佳答案

一个 http 请求只能得到一个 http 响应。使用 http,您只能得到一个响应。为您提供一些选择:

1) 等待一切完成后再回复。确保每个部分都会产生结果(成功或失败),并立即发送多个响应。您需要一些控制流库,例如 asyncPromises确保所有内容同时响应。如果所有部分都会“快速”发生,那么这是一个不错的选择,如果您的用户等待响应“太长时间”,则不好。 (这些术语用引号引起来,因为它们取决于应用程序)。

2) 创建一些方案,其中第一个响应告诉要等待多少个其他响应。然后,您将有一个不同的 HTTP 请求,请求第一条附加消息,当该请求返回到您的客户端时,请求第二条附加消息,依此类推。不过,这需要大量的协调,因为您必须缓存响应,或者如果尚未完成则重试。使用像 redis (或类似的)这样的内存缓存可以满足保存响应直到准备好的需要,不存在的意思是“未准备好”

3) 使用事件协议(protocol),例如 WebSocket,可以从服务器推送消息。这是一个不错的选择,特别是当您不知道触发后某些事件会发生多长时间时。 (您不希望将 HTTP 请求拖延数十秒以等待 3 个部分完成 - 用户会感到无聊,或者退出,或者重新提交。)。一定要看看Primus此选项的库。它甚至可以为客户端脚本提供服务,这使得集成变得快速而简单。

关于angularjs - 通过nodejs向客户端发送多个响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27902277/

25 4 0
文章推荐: node.js - 为什么 Node 的 'fs' 模块没有加载? (错误: Object # has no method 'readFile' )