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

时间:2015-01-12 12:41:10

标签: angularjs node.js express

我正在使用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的新手,请帮我解决方案

1 个答案:

答案 0 :(得分:4)

http请求只获得一个http响应。使用http,您只能获得一个响应。一些选项:

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

2)创建一些方案,其中第一个响应告诉等待多少其他响应。然后,您将有一个不同的HTTP请求,要求提供第一个附加消息,当它返回到您的客户端时,请求第二个附加消息,依此类推。这是很多协调,因为你必须缓存响应,或者如果还没有完成再试一次。使用像redis(或类似的)一样的内存缓存可以满足在准备好之前保持响应的需要,并且不存在意义“未准备好”

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

相关问题