Question

J'ai créé ce type de code pour obtenir des nouvelles de l'exportation xml à partir d'un autre site et je suis en train de remplir à ma base de données.

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);
      }
    });
}

Pour les individuels, actualités, ça fonctionne bien, mais lorsque je l'exécute sur l'ensemble de xml, j'obtiens cette erreur:

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.

Et pour les quelques derniers objets, j'obtiens cette erreur:

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

Merci pour l'aide

Était-ce utile?

La solution

Le problème, c'est que vous êtes en train de faire trop d'simultanées (insert) opérations dans votre base de données.Rappelez-vous que dans node.js (presque) tout est asynchrone, lorsque vous appelez InsertActionToDatabase pour l'un des éléments, cette opération va commencer tout de suite et ne pas attendre avant la fin de la retourner.Vous êtes donc en fait, d'essayer d'insérer tous les événements à la fois, et que le message d'erreur dit qu'il ya une limite sur le nombre de connexions simultanées qui peuvent être apportées à SQL server.

Ce que vous devez faire est de changer votre boucle pour exécuter de manière asynchrone, en attendant que l'une des opérations à accomplir avant de commencer la suivante (vous pouvez aussi en "batch" envoyer un plus petit nombre d'opérations à la fois, en continuant après chaque lot est complet, mais le code est un peu plus compliqué) comme indiqué ci-dessous.

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);

Et la InsertActionToDatabase la fonction serait de prendre un paramètre de rappel à appeler lorsque c'est fait.

function InsertActionToDatabase(item, done) {
    var table = tables.getTable('event');
    table.insert(item, {
        success: function() {
            console.log('Inserted event: ', item);
            done();
        }
    });
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top