Pregunta

He creado un código como este para conseguir noticias de exportación xml de otro sitio web y estoy tratando de llenar con mi base de datos.

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

Para el individuo realidades funciona bien, pero cuando lo ejecuto en la totalidad de xml me sale este error:

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.

Y por algunos objetos me sale este error:

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

Gracias por la ayuda

¿Fue útil?

Solución

El problema es que estás tratando de hacer demasiadas concurrente (insertar) para las operaciones en la base de datos.Recuerde que en node.js (casi) todo lo que es asincrónica, así que cuando usted llama InsertActionToDatabase para uno de los elementos, esta operación se iniciará de inmediato y no esperar antes de que termine para volver.Así que, básicamente, tratando de insertar todos los eventos a la vez, y como el mensaje de error dice que hay un límite en el número de conexiones simultáneas que se pueden hacer a la de SQL server.

Lo que usted necesita hacer es cambiar el bucle para ejecutar de forma asincrónica, a la espera de una de las operaciones que se complete antes de comenzar la siguiente (también puede "lote" enviar un menor número de operaciones a la vez, continuando después de cada lote se completa, pero el código es un poco más complicado) como se muestra a continuación.

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

Y el InsertActionToDatabase función de tomar una devolución de llamada el parámetro que se llama cuando se hace.

function InsertActionToDatabase(item, done) {
    var table = tables.getTable('event');
    table.insert(item, {
        success: function() {
            console.log('Inserted event: ', item);
            done();
        }
    });
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top