2016-07-03 15 views
0

私はmeteorを使ってapiメソッドをビルドする必要があります。すぐにOKを返し、長時間の作業が終わったらwebhookをリクエストする必要があります。流星群側。 .thenの中でhttpリクエストを呼び出す

サンプルコードは、結果として、この

import { Meteor } from 'meteor/meteor'; 
let Promise = require('bluebird'); 

Meteor.startup(() => { 
    Picker.route('/', (params, req, res, next) => { 
    getAnimalName = Promise.promisify((cb) => { 
     setTimeout(() => { 
      cb(null, "porcupine"); 
     }, 1000); 
    })() 

    getAnimalName.then((name) => { 
     HTTP.get('https://www.google.ru/#q='+name, (err, res) => { 
      if(! err){ 
       console.log(res); 
      } 
     }); 
    }); 

    res.end("OK"); 
    }); 
}); 

のように見える私は

W20160704-02:14:10.908(3)? (STDERR) Unhandled rejection Error: Meteor code must always run within a Fiber. Try wrapping callbacks that you pass to non-Meteor libraries with Meteor.bindEnvironment. 
W20160704-02:14:10.908(3)? (STDERR)  at Object.Meteor._nodeCodeMustBeInFiber (packages/meteor/dynamics_nodejs.js:9:1) 
W20160704-02:14:10.909(3)? (STDERR)  at Object.Meteor.bindEnvironment (packages/meteor/dynamics_nodejs.js:85:1) 
W20160704-02:14:10.909(3)? (STDERR)  at Object.call (packages/meteor/helpers.js:117:1) 
W20160704-02:14:10.909(3)? (STDERR)  at Object.HTTP.get (packages/http/httpcall_common.js:50:20) 
W20160704-02:14:10.909(3)? (STDERR)  at server/main.js:14:10 
W20160704-02:14:10.910(3)? (STDERR)  at [object Object]._onTimeout (server/main.js:8:6) 
W20160704-02:14:10.910(3)? (STDERR)  at Timer.listOnTimeout [as ontimeout] (timers.js:121:15) 
W20160704-02:14:10.910(3)? (STDERR) From previous event: 
W20160704-02:14:10.911(3)? (STDERR)  at server/main.js:12:18 
W20160704-02:14:10.911(3)? (STDERR)  at doCall (packages/meteorhacks_picker/packages/meteorhacks_picker.js:106:1) 

このエラーを取得する私は約束のためにMeteor.bindEnvironmentへのコールバックといくつかの流星パッケージを包む、FiberHTTP.getを包むような別のものを試してみました。そして、エラーは同じでした。約束の中でhttpリクエストを行う方法がありますか.then? (私のコードの大部分はすでに約束の点で書かれており、私はファイバーなどでそれをリファクタリングしたくありません)。ありがとう。

答えて

0

BluebirdとMeteorで同じ問題が発生しました。問題はタイムアウトです。

タイムアウトを使用する場合は、Meteor.setTimeout()またはMeteor.bindEnvironment()を使用してください。

あなたのタイムアウトを変更する必要があります。また、Bluebirdが内部でsetTimeout()を使用するという問題もあります。 Bluebird.promisify()はうまくいくようですが、Meteorに付属のPromiseポリフィルを使用するほうが良いでしょう。ここで

は、あなたが使用することができますpromisify交換です:

function promisify(fn, options){ 
    return function(){ 
    options = Object.assign({ 
     context: this, 
     multiArgs: false 
    }, options); 

    let slice = (arr, i, j) => Array.prototype.slice.call(arr, i, j); 

    let args = slice(arguments); 

    return new Promise((resolve, reject) => { 
     let callback = (err, val) => { 
     if(err != null){ 
      reject(err); 
     } else { 
      resolve(options.multiArgs ? slice(arguments, 1) : val); 
     } 
     }; 

     args.push(callback); 

     fn.apply(options.context, args); 
    }); 
    }; 
} 
関連する問題