2016-12-21 17 views
-2

私はEbay APIから2つのサービスを利用しようとしています: findItemsByKeywords(keyword):アイテム(オブジェクト)のリストを返します。 getItemTransactions(itemId):アイテムのトランザクション(オブジェクト)のリストを返します。別の約束の中で約束を(ループで)呼び出すことはできますか?

findItemsByKeywordsを呼び出して返品後の商品リストを取得した後、getItemTransactionsに電話してその商品のそれぞれの取引を取得し、それらの商品で新しいリストを作成する必要があります。

私は私のコードは唯一つの相互作用のために働くのNode.js、エクスプレス、EJSとMongoDBの

を使用しています。

Error: 
Error: unable to connect to database at mongodb://localhost/simplysell-development 
    at NativeConnection.<anonymous> (/Users/guilhermefalcao/workspace/simplysell/app.js:11:9) 
    at emitOne (events.js:96:13) 
    at NativeConnection.emit (events.js:188:7) 
    at Db.<anonymous> (/Users/guilhermefalcao/workspace/simplysell/node_modules/mongoose/lib/drivers/node-mongodb-native/connection.js:169:10) 
    at emitTwo (events.js:106:13) 
    at Db.emit (events.js:191:7) 
    at Server.listener (/Users/guilhermefalcao/workspace/simplysell/node_modules/mongodb/lib/db.js:1786:14) 
    at emitOne (events.js:96:13) 
    at Server.emit (events.js:188:7) 
    at Server.<anonymous> (/Users/guilhermefalcao/workspace/simplysell/node_modules/mongodb/lib/server.js:274:14) 
    at emitOne (events.js:96:13) 
    at Server.emit (events.js:188:7) 
    at Pool.<anonymous> (/Users/guilhermefalcao/workspace/simplysell/node_modules/mongodb-core/lib/topologies/server.js:334:12) 
    at emitOne (events.js:96:13) 
    at Pool.emit (events.js:188:7) 
    at Connection.<anonymous> (/Users/guilhermefalcao/workspace/simplysell/node_modules/mongodb-core/lib/connection/pool.js:270:12) 

私はデータベースにアクセスしようとしていませんが、なぜこのエラーが発生するのかわかりません。

コードと英語の品質についてお詫び申し上げます。私は今から始めていますです。

router.get('/bestsellers', (req, res, next) => { 
    var i = 0; 
    var findItemsByKeywordsPromise = findItemsByKeywords('iphone'); 
    findItemsByKeywordsPromise.then(items => { 
    var getItemTransactionsPromise = getItemTransactions(items); 
    return getItemTransactionsPromise; 
    }).then(test => console.log(test)) 

}); 

function getItemTransactions(items) { 

    return new Promise((resolve, reject) => { 
    var list = []; 
    items.forEach(function (item) { 

     ebay.xmlRequest({ 
     serviceName: 'Trading', 
     opType: 'GetItemTransactions', 

     // app/environment 
     devId: 'xxxxxxx', 
     certId: 'xxxxxxx', 
     appId: 'xxxxxxx', 
     sandbox: false, 

     // per user 
     authToken: 'xxxxxxx', 

     params: { 
      'ItemID': item.itemId, 
      'NumberOfDays': 30 
     } 
     }, function (error, results) { 
     list.push(results) 
     resolve(list); 
     }); 
    }) 
    }); 

} 

function findItemsByKeywords(keywords) { 

    return new Promise((resolve, reject) => { 

    var params = { 
     keywords: [keywords], 
    }; 

    ebay.xmlRequest({ 
     serviceName: 'Finding', 
     opType: 'findItemsByKeywords', 
     appId: 'xxxx',  // FILL IN YOUR OWN APP KEY, GET ONE HERE: https://publisher.ebaypartnernetwork.com/PublisherToolsAPI 
     params: params, 
     parser: ebay.parseResponseJson // (default) 
    }, 
     // gets all the items together in a merged array 
     function itemsCallback(error, itemsResponse) { 
     if (error) reject(error); 

     console.log('findItemsByKeywords called'); 

     var items = itemsResponse.searchResult.item; 

     console.log('Found', items.length, 'items'); 
     resolve(items); 
     } 
    ); 
    }); 
} 
+0

あなたの依存関係は何ですか?私はしばしばこのエラーをMongooseのようなパッケージを含めて実際にmongodbサーバを起動させないようにしました。だから、どちらかのアウト/コメントパッケージを削除するか、MongoDBの –

+0

@CodyGuldner するvar急行=( '表現')が必要です、 ルータ= express.Router()、 マングース=が( 'マングース')を要求し、 条=マングースを開始します。モデル( 'Article'); var ebay = require( 'ebay-api'); –

+0

あなたのmongoクライアントが起動していることを確認してください、またはエラーが発生します –

答えて

-2

権利だこと。 eBay APIより前のループ終了は値を返すので、解決は不完全な配列(リスト)を返します。

function getItemTransactions(items) { 

    return new Promise((resolve, reject) => { 
    var list = []; 
    items.forEach(function (item) { 

     ebay.xmlRequest({ 
     serviceName: 'Trading', 
     opType: 'GetItemTransactions', 

     // app/environment 
     devId: 'xxxxxxx', 
     certId: 'xxxxxxx', 
     appId: 'xxxxxxx', 
     sandbox: false, 

     // per user 
     authToken: 'xxxxxxx', 

     params: { 
      'ItemID': item.itemId, 
      'NumberOfDays': 30 
     } 
     }, function (error, results) { 
     list.push(results) 
     if (list.length == items.length) { 
      resolve(list); 
     } 
     }); 
    }) 
    }); 

} 

これは私が変更するものですが、私はリストの配列が完了したときに解決しています:

if (list.length == items.length) { 
    resolve(list); 
} 
-1

そのモンゴ・エラーが起こっている理由は、我々が知ることができないコードを見てみる:ここ

はいくつかのコードです。

しかし、タイトルの答えに答えると、関数getItemTransactionsは間違っています。配列内の各項目に対してresolveを呼び出していますが、約束は一度しか解決できないため、解決する最初の項目を返すだけです。

私は2つの機能でそれを整理します:あなたはあなたのメインのコード内でその操作を行う場合

function getItemTransaction (item) { 
    return Promise(function (resolve, reject) { 
     ebay.xmlRequest({ 
      serviceName: 'Trading', 
      opType: 'GetItemTransactions', 

      // app/environment 
      devId: 'xxxxxxx', 
      certId: 'xxxxxxx', 
      appId: 'xxxxxxx', 
      sandbox: false, 

      // per user 
      authToken: 'xxxxxxx', 

      params: { 
       'ItemID': item.itemId, 
       'NumberOfDays': 30 
      } 
     }, function (error, results) { 
      if (error) { 
       return reject(error); 
      } 
      resolve(results); 
      }); 
    }); 
} 


function getItemTransactions(items) { 
    var promises = items.map(function(item) { 
     return getItemTransaction(item); 
    }); 
    // Promise.all waits for all the promises to get resolved 
    // and return an array of resolved promises 
    return Promise.all(promises); 
} 

第二の機能は、必要ではないかもしれません。

findItemsByKeywords('iphone') 
    .then(items => { 
     return Promise.all(items.map(item => getItemTransaction(item)); 
    }) 
    .then(test => console.log(test)); 
+0

私はこの回答が否定的な投票とコメントがないのは不思議です。 –

関連する問題