NODE.JS 'запрос' не добавляет ответ в массив - PullRequest
0 голосов
/ 02 ноября 2019

Итак, я пытаюсь получить данные о рынке сообщества steam. И это работает для небольшого количества предметов, но когда я пытаюсь сделать CS: GO (в среднем 13400 предметов), это не так. Я использую Steam JSON, который позволяет мне получать 100 предметов одновременно. Код выполняет следующее: внутри цикла он получает случайную паузу (я знаю, какой это уродливый способ сделать паузу, но другой способ заморозил мой цикл), затем я отправляю первый запрос. Я проверяю, получил ли я ответ, и если мой код ответа был 200 (= успех), тогда я получаю каждый элемент из массива json и проверяю, есть ли он уже в моем массиве или нет, если нет, я добавляю его.

Но здесь кроется проблема. Кажется, что он выполняет все циклы запроса, а затем, в конце, он, кажется, выполняет все элементы, добавляемые в массив. Вместо выполнения запроса добавьте элемент, а затем начните новый запрос и продолжайте.

const colors = require('colors/safe');
const request = require('request');
const random = require('random');
var fs = require('fs');

var itemNames = new Array();

console.log(colors.green(time() + 'Starting Steam Market Monitor...'));

request('https://steamcommunity.com/market/search/render/?search_descriptions=0&sort_column=default&sort_dir=desc&appid=730&norender=1&start=0&count=100', function(err, res, body) {
    if (res.statusCode == 200 && res.statusCode != undefined) {
    var itemsObj = JSON.parse(body);
    var totalItems = itemsObj['total_count'];
    console.log(colors.green(time() + 'Total of items found: ' + totalItems));
    getItems(totalItems);
    } else {
        console.log(colors.red(time() + 'Response code: ' + res.statusCode));
    }
});

function getItems(totalItems) {
    var status = 200; //default success message
    console.log(colors.green(time() + "Started item grabbing."));


    for (var i = 0; i < totalItems; i+= 100) {

        var options = {
            url: 'https://steamcommunity.com/market/search/render/?search_descriptions=0&sort_column=default&sort_dir=desc&appid=730&norender=1&start='+ i +'&count=100'
        };

        var dt = new Date();
        var randomSeconds = random.int(115, 125);
        dt.setSeconds( dt.getSeconds() + randomSeconds );
        while(dt > new Date()) {}
            console.log(colors.green(time() + "Getting items " + i + " out of " + totalItems + " items"));
                var dt = new Date();
                var randomSeconds = random.int(55, 65);
                dt.setSeconds( dt.getSeconds() + randomSeconds );
                while(dt > new Date()) {}
                request(options, function(err, res, body) {
                    if(res) {
                        if (res.statusCode == 200 && res.statusCode != undefined) {
                            var itemsObj = JSON.parse(body);
                            var itemsArr = itemsObj['results'];

                            for (var j = 0; j < 100; j++) {
                                var item = itemsArr[j]['hash_name'];
                                if (itemNames.indexOf(item) > -1) {
                                    if (j == 99) {
                                    }
                                } else {
                                    console.log(item);
                                    itemNames.push(item);
                                    if (j == 99) {
                                    }
                                }
                            }
                        } else {
                            console.log(colors.red(time() + 'Response code: ' + res.statusCode));
                        }
                    } else {
                        console.log(colors.red(time() + 'Undefined response...'));
                    }
                });
    }
}

1 Ответ

1 голос
/ 02 ноября 2019

Вместо этого вы можете использовать запрос-обещание пакет, чтобы вы могли выполнять свои запросы асинхронно, поэтому ваш цикл будет ждать до конца запроса

Так что ваш код может быть улучшен в этомпуть:

const colors = require('colors/safe');
const rp = require('request-promise');
const random = require('random');
var fs = require('fs');

var itemNames = new Array();

console.log(colors.green(time() + 'Starting Steam Market Monitor...'));

rp('https://steamcommunity.com/market/search/render/?search_descriptions=0&sort_column=default&sort_dir=desc&appid=730&norender=1&start=0&count=100',)
.then(function (res) {
    if (res.statusCode == 200 && res.statusCode != undefined) {
    var itemsObj = JSON.parse(body);
    var totalItems = itemsObj['total_count'];
    console.log(colors.green(time() + 'Total of items found: ' + totalItems));
    await getItems(totalItems);
    } else {
        console.log(colors.red(time() + 'Response code: ' + res.statusCode));
    }
})
.catch(function (err) {
        console.log(err);
    });

async function getItems(totalItems) {
    var status = 200; //default success message
    console.log(colors.green(time() + "Started item grabbing."));


    for (var i = 0; i < totalItems; i+= 100) {

        var options = {
            uri: 'https://steamcommunity.com/market/search/render/?search_descriptions=0&sort_column=default&sort_dir=desc&appid=730&norender=1&start='+ i +'&count=100'
        };

            console.log(colors.green(time() + "Getting items " + i + " out of " + totalItems + " items"));
                await rp(options)
               .then(function (res) {
                    if(res) {
                        if (res.statusCode == 200 && res.statusCode != undefined) {
                            var itemsObj = JSON.parse(body);
                            var itemsArr = itemsObj['results'];

                            for (var j = 0; j < 100; j++) {
                                var item = itemsArr[j]['hash_name'];
                                if (itemNames.indexOf(item) > -1) {
                                    if (j == 99) {
                                    }
                                } else {
                                    console.log(item);
                                    itemNames.push(item);
                                    if (j == 99) {
                                    }
                                }
                            }
                        } else {
                            console.log(colors.red(time() + 'Response code: ' + res.statusCode));
                        }
                    } else {
                        console.log(colors.red(time() + 'Undefined response...'));
                    }
                }).catch(function (err) {
                   console.log(err);
                });
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...