将req对象添加到Kue作业

时间:2017-11-12 19:12:17

标签: node.js express kue

一直在寻找互联网,试图找到以下不起作用的答案。

我在添加作业时尝试传递req对象,以便在处理作业时可以访问它。

但是当整个req对象传递给job.data时,永远不会执行该过程。然而,我可以传递req对象的一部分。

我正在尝试做的事情可能是反模式,而不是很大。但是,我试图理解为什么它不起作用。它似乎很奇怪,只是没有任何错误。

以下是一个例子,希望很清楚。

我的kue被抽象为一个单独的文件,并初始化为app.locals.Q,如下所示:

// Q.js

class Q {
    constructor(options) {
        this.q = kue.createQueue(options)
    }

    addJob = (name, data) => {
    return Queue.create({
        queue_job: name,
        queue_route: data.route,
        queue_user: data.user,
        queue_added: new Date(),
    })
        .then(response => {
            this.q.create(name, {
                id: response.get('queue_id'),
                route: data.route,
                request: data.request
            })
                .save();
            return Promise.resolve(response);
        })
        .catch(error => {
            return Promise.reject(error);
        });

    processJob = (name, work, options = {}) => {
    const {concurrency} = options;
    this.q.process(name, concurrency || 1, (job, done) => {
        const {data: {id, route, request}} = job;
        Queue.update({
            queue_running: true
        }, {
            where: {
                queue_id: id
            }
        })
            .then(() => {
                if (process.env.NODE_ENV !== 'production') {
                    console.log(`running job ${id} from ${route}`);
                }
                return new Promise((resolve, reject) => {
                    return work(resolve, reject, request);
                });
            })
            .then(results => {
                return Queue.update({
                    queue_running: false,
                    queue_completed: new Date(),
                    queue_results_path: results || null
                }, {
                    where: {
                        queue_id: job.data.id
                    }
                });
            })
            .then(() => {
                if (process.env.NODE_ENV !== 'production') {
                    console.log(`completed job ${id} from ${route}`);
                }
                done();
            })
            .catch((error) => {
                if (process.env.NODE_ENV !== 'production') {
                    console.log(`failed job ${id} from ${route}`);
                    console.log(error);
                }
                Queue.update({
                    queue_running: false,
                    queue_error: `${error}`

                }, {
                    where: {
                        queue_id: id
                    }
                })
                    .then(() => {
                        done(error);
                    })
                    .catch(err => {
                        console.error(err);
                        done(err);
                    });
            });
        });
    };

};
// example route

queue = (req, res) => {
    const {locals: {Q}} = req.app;
    Q.addJob('foo', {
            route: req.path,
            user: req.user.get('username'),
            request: req
        })
        .then(queue_id => {
                Q.processJob('foo', (resolve, reject, request) => {
                        console.log(request)
                        resolve('complete')
                    })
                res.json({sucess: true})
            }) 
        }

1 个答案:

答案 0 :(得分:0)

redis无法序列化req对象。

kue只是默默地失败。