Вопрос

Я создал такой код для получения новостей из экспорта XML с другого веб-сайта и пытаюсь заполнить им свою базу данных.

function UpdateLunchTime() {
    var httpRequest = require('request');
    var xml2js = require('xml2js');
    var parser = new xml2js.Parser();
    var url = 'http://www...com/export/xml/actualities';
    httpRequest.get({
            url: url
    }, function(err, response, body) {
        if (err) {
            console.warn(statusCodes.INTERNAL_SERVER_ERROR, 
                'Some problem.');
        } else if (response.statusCode !== 200) {
            console.warn(statusCodes.BAD_REQUEST, 
                'Another problem');
        } else {
            //console.log(body);
            parser.parseString(body, function (err2, result) {
                //console.log(result.Root.event);
                var count = 0;
                for (var i=0;i<result.Root.event.length;i++)
                { 
                    //console.log(result.Root.event[i]);
                    InsertActionToDatabase(result.Root.event[i]);
                }
                /*
                result.Root.event.forEach(function(entry) {
                    InsertActionToDatabase(entry);
                });
                */
            });
        }
    });
}

function InsertActionToDatabase(action)
{
    var queryString = "INSERT INTO Action (title, description, ...) VALUES (?, ?, ...)";
    mssql.query(queryString, [action.akce[0], action.description[0],...], {
    success: function(insertResults) {
    },
      error: function(err) {
      console.log("Problem: " + err);
      }
    });
}

В отдельных случаях все работает нормально, но когда я запускаю его по всему XML, я получаю эту ошибку:

Error: [Microsoft][SQL Server Native Client 10.0][SQL Server]Resource ID : 1. The request limit for the database is 180 and has been reached. See 'http://go.microsoft.com/fwlink/?LinkId=267637' for assistance.

И для нескольких последних объектов я получаю эту ошибку:

Error: [Microsoft][SQL Server Native Client 10.0]TCP Provider: Only one usage of each socket address (protocol/network address/port) is normally permitted.

Спасибо за помощь

Это было полезно?

Решение

Проблема в том, что вы пытаетесь выполнить слишком много одновременных операций (вставки) в своей базе данных.Помните, что в node.js (почти) все асинхронно, поэтому при вызове InsertActionToDatabase для одного из элементов эта операция начнется сразу, а не дожидаясь ее завершения для возврата.Таким образом, вы по сути пытаетесь вставить все события одновременно, и, как сказано в сообщении об ошибке, существует ограничение на количество одновременных подключений, которые могут быть установлены к SQL-серверу.

Что вам нужно сделать, так это изменить свой цикл для асинхронного выполнения, дождавшись завершения одной из операций, прежде чем запускать следующую (вы также можете «пакетно» отправить меньшее количество операций одновременно, продолжая после завершения каждого пакета). , но код немного сложнее), как показано ниже.

var count = result.Root.event.length;
var insertAction = function(index) {
    if (index >= count) return;
    InsertActionToDatabase(result.Root.event[i], function() {
        insertAction(index + 1);
    });
}
insertAction(0);

И InsertActionToDatabase функция будет принимать параметр обратного вызова для вызова, когда она будет выполнена.

function InsertActionToDatabase(item, done) {
    var table = tables.getTable('event');
    table.insert(item, {
        success: function() {
            console.log('Inserted event: ', item);
            done();
        }
    });
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top