前提・実現したいこと
非同期通信やpromiseについての理解が乏しいので質問させてください。
取得したjanコードを元にkeepaのapiで他サイトの価格を引っ張ってくるツールを制作しようとしています。
元のjanコードの量は場合により1000,2000個のような膨大な数になる可能性があり(ここではdataListX)、keepaのapiではリクエスト上限が100なのでjanコードを100ずつ区切ってapiを叩いて結果を取得して整形..と繰り返していきたいのですが、
ここのコードの26行目以下(await sendData(chunk).then((response)=> { ..の部分)でレスポンスがないまま先に進んでしまいエラーになります。
promise周りのみならず、書き方がまずい部分もあればご教授いただきたいです。
よろしくおねがいします。
発生している問題・エラーメッセージ
(node:220) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'length' of undefined (node:220) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1) (node:220) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
該当のソースコード
JavaScript
1const puppeteer = require('puppeteer'); 2const fs = require('fs'); 3const rp = require('request-promise'); 4const $ = require('jQuery'); 5const _ = require( 'lodash' ); 6 7var dataListY = [] 8 9let dataListX = [ 10 ["https://www.netsea.jp/shop/25774/UAG-SFPRO4-BLK?cx_search=score","4988481755953","ビギナー拒否設定のため非公開"], 11 ["https://www.netsea.jp/shop/25774/UAG-SFPRO4-CBT?cx_search=score","4988481755977","ビギナー拒否設定のため非公開"], 12 ["https://www.netsea.jp/shop/25774/CRT-PFNG116W?cx_search=score","4969887294314","ビギナー拒否設定のため非公開"], 13 ... 14]; 15 16 17//リクエストを作成 18let productCodes = []; //#2 100個まで 19for (var i = 0; i < dataListX.length; i++) { 20 productCodes.push(dataListX[i][1]); 21} 22 23async function dataFlow(){ 24 for ( const chunk of _.chunk( productCodes, 100 ) ) { 25 // 100ずつの配列をsendData関数に渡す 26 await sendData(chunk).then((response)=> { 27 if(response){ 28 let products = response.products; //response.products にそれぞれの商品のデータが配列で入ってる 29 console.log(products.length); //=>3 3つリクエストしたのでレスポンスも3つ 30 for(var i=0;i<products.length;i++){ 31 var product = products[i]; 32 let itemDetail = []; 33 if(product.eanList) { 34 itemDetail.push(String(product.eanList)); // EAN(JAN) 35 } else { 36 itemDetail.push(''); 37 } 38 itemDetail.push(product.title); // 商品名 39 if(product.csv[0]) { // Amazon本体の最新の出品価格 40 itemDetail.push(product.csv[0][product.csv[0].length-1]); 41 } else{ 42 itemDetail.push(''); 43 } 44 if(product.csv[1]) { // 新品の最新の出品価格(最安値) 45 itemDetail.push(product.csv[1][product.csv[1].length-1]); 46 } else { 47 itemDetail.push(''); 48 } 49 // console.log('---------------------------------------------------------------------------'); 50 dataListY.push(itemDetail); 51 console.log(dataListY); 52 for(var i=0;i<dataListX.length;i++){ 53 for(var ii=0;ii<dataListY.length;ii++){ 54 let searchItem = dataListY.vlookup(dataListY[ii][0], 0); 55 let pushItem1 = dataListY.vlookup(dataListY[ii][0], 1); 56 let pushItem2 = dataListY.vlookup(dataListY[ii][0], 2); 57 let pushItem3 = dataListY.vlookup(dataListY[ii][0], 3); 58 if (dataListX[i][1] === searchItem) { 59 dataListX[i].push(pushItem1, pushItem2, pushItem3); 60 } 61 } 62 } 63 } 64 } 65 }) 66} 67dataFlow(); 68 69async function sendData(chunk) { 70 const options = { 71 url : 'https://api.keepa.com/product', 72 method : 'POST', 73 form : { 74 key : xxxxxxxxxxxxxx, 75 code : chunk.join(','), 76 domain : '5', 77 }, 78 gzip: true, 79 headers : { 80 'Content-Type':'application/json', 81 'Connection' : 'keep-alive' 82 }, 83 json : true, 84 resolveWithFullResponse: true 85 } 86 const response = rp(options); 87 if(response) return response; 88} 89
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/12/17 15:12
2020/12/18 02:48