2017-11-12 5 views
0

インターネットを狩って、以下の理由が解決されない理由を知りました。Kueジョブにreqオブジェクトを追加する

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}) 
      }) 
     } 

答えて

0

redisはREQオブジェクトをシリアル化することができません。

kueは、単に静かに失敗します。

関連する問題