Ein API-Service beschränkend mich oder mein Riese für Loop zu schnell für meine POST-Anfrage?

Ich habe einen Klienten, der 8000 Einzelteile schob, die zu seinem shopify memory geschoben werden.

Ich habe diesen Code gemacht, aber ich habe ein Problem: Sofern ich die ausgehenden Verbindungen nicht auf ca. 1-2 beschränke, antwortet das Item Posting mit undefined und scheitert …. meine Loop / Post-Req könnte zu schnell sein, aber alle methods, die ich versucht habe verlangsamen sie mit fehlgeschlagen

  1. Hier API Einschränkungen von ihnen gesetzt

2 Anrufe pro Sekunde, mit Platz für einen Ausbruch von 40 Anrufen auf einmal.

Ich benutze node.js und das ms sql plugin. Die data von ms sql kommen fein über Streams und wird zu meinem Array rowPush gedrückt, dann schließe ich es durch (8000), um die Post req über Unicast zu senden.

sql.connect(userConfig, function(err) { if (err) { console.log("you done screwed up the dang connection to SQL " + err) }; var request = new sql.Request(); request.stream = true; request.verbose = true; request.query('SELECT intProductID, Stock, strPurDesc, Vendor, Brand, intPurchasePrice, strBarCode FROM V_ProductList ORDER BY intProductID'); var rowPush = []; //row is the object that returns from MySQL database. request.on('row', function(row) { rowPush.push(row); }); request.on('error', function(err) { console.log('err occured ' + err); }); request.on('done', function(returnValue) { //my for loop for looping through every item in rowPush. for (i =0; i < rowPush.length; i++ ) { var newProduct = { "product": { "title": rowPush[i].strPurDesc, "id": rowPush[i].intProductID, "vendor": rowPush[i].Vendor, "product_type": rowPush[i].Brand, "variants": [ { //"id": 1044399237, //"product_id": 1071559589, "inventory_management":"shopify", "inventory_quantity": rowPush[i].Stock, "barcode": rowPush[i].strBarCode, "price": rowPush[i].intPurchasePrice, "taxable" : true, } ] } }; //console.log(JSON.stringify(newProduct)); var sendNewItem = function (){ unirest.post('https://5b848c9ca0e184f13140629d9c2d34ca:b8b14f71ad82a7d8f00520f8a4f5f571@teststoresrh.myshopify.com/admin/products.json') //.header('Accept', 'application/json') .set('Content-Type', 'application/json') .send(newProduct) .end(function (response) { console.log(response.body); }); } if (rowPush[i].Vendor) { sendNewItem(); }; //sendNewItem(); } }); console.log(rowPush[8210]); }); //}); sql.on('error', function(err) { console.log("you done screwed up the dang connection to SQL " + err); }); 

Im Moment überfluten Sie das System. Ich hatte Glück mit ein paar hundert Gegenständen mit einem Muster wie das unten. In Kürze wird jedes Produkt nur gesendet, wenn der vorherige Anruf zurückgibt. Wenn du dich wirklich drosseln musst, kannst du die kommentierte setTimeout-Linie anstelle des darüber liegenden ausprobieren.

 var https = require('https'); var cred = new Buffer(5b848c9ca0e184f13140629d9c2d34ca:b8b14f71ad82a7d8f00520f8a4f5f571").toString('base64'); var headers = {Authorization: "Basic "+cred, "Content-Type": "application/json"}; var options = { host: 'teststoresrh.myshopify.com', port: 443, path: '/admin/products.json', method: 'POST', headers: headers }; var rowPush = []; // fill rowPush from sql function sendProduct(){ if(!rowPush.length) return; var row = rowPush.shift(); // FIFO var newProduct = (function(){ // just like now but with row instead of rowPush[i]; })(); // Setup the request. The options parameter is // the object we defined above. var req = https.request(options, function(res) { res.setEncoding('utf-8'); var responseString = ''; res.on('data', function(data) { responseString += data; console.log(data); }); res.on('end', function() { var resultObject = JSON.parse(responseString); sendProduct(); //setTimeout(sendProduct, 500); }); }); req.on('error', function(e) { // TODO: handle error. console.log(e); }); req.write(JSON.stringify(newProduct)); req.end(); } sendProduct(); 

Es gibt ein Knotenmodul, das functionsaufrufe drosseln kann: Drosselklappenfunktion .