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

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 新手,请帮助我解决方案

cla*_*lay 5

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

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

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

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