Tengo algunos problemas con Node.js, y creo que el problema podría ser que estoy malinterpretando el enfoque de Node.js respecto a la concurrencia. Aquí hay un ejemplo simplificado del servidor que he escrito. La idea es que el servidor se utilice para pruebas automatizadas: mantiene una lista de las "configuraciones" esperadas y las compara con las "configuraciones" que envía el cliente.El rastreo de depuración de Node.js parece implicar varios hilos de ejecución: ¿cómo interpretar esto correctamente?
//expectedConfigurations gets initialized up here
var server = http.createServer(function(request, response) {
switch (url.pathname) {
case "/check-configuration":
jsonData = "";
request.on("data", function(data) {
return jsonData += data;
});
request.on("end", function() {
var configuration, errMsg, expectedConfiguration;
console.log("finished reading json data", jsonData);
expectedConfiguration = expectedConfigurations.shift();
console.log("Expected configuration", expectedConfiguration);
configuration = new Set(JSON.parse(jsonData));
if (expectedConfiguration.equals(configuration)) {
response.writeHead(200, {"Content-Type": "text/plain"});
response.write("Matched expected configuration.");
return response.end();
} else {
response.writeHead(500, {
"Content-Type": "text/plain"
});
errMsg = "Did not match expected configuration. Received: " + (JSON.stringify(configuration)) + ". Expected:" + (JSON.stringify(expectedConfiguration)) + ".";
response.write(errMsg);
response.end();
console.error(errMsg);
results.testsFailed.push(currentTest);
return transitionToBeforeSendingTestState();
}
})
}
})
Mi entendimiento es que Node.js es de un solo subproceso, lo que si bien puede generar múltiples tareas que pueden ser manejados de forma asíncrona, sólo un hilo de ejecución a la vez va a introducir el código JavaScript se ejecuta en Node.js . Por desgracia, la salida de depuración que estoy recibiendo de mi servidor parece desafiar esta suposición:
received request for /check-configuration
finished reading json data [ "a" ]
Expected configuration [ "a" ]
received request for /check-configuration
Did not match expected configuration. Received: [ "a" ]. Expected: [ "c" ].
leí esto como el siguiente:
- el servidor recibe una petición. Comienza a leer datos de solicitud de forma asincrónica.
- el servidor termina de leer datos de la solicitud, muta expectedConfigurations por el cambio, y asigna los resultados a expectedConfiguration
[ 'a' ]
- el hilo y luego se interrumpe por una nueva solicitud al servidor! aquí es donde mis expectativas de la ejecución de un único subproceso de contenido de JavaScript en Node.js parecen romperse.
- Finalmente, se reanuda el hilo original de ejecución asociado con la primera solicitud. La configuración esperada se compara con la configuración real recibida, pero ahora, en lugar de tener el valor
[ 'a' ]
, como lo hizo en el paso 2., tiene el valor["c"]
.
Parece que debo interpretar esto incorrectamente, porque me impide entender el modelo de ejecución de un único subproceso de Node.js, pero ahora no puedo ver cómo se puede interpretar esto. Agradecería cualquier orientación que cualquiera pueda ofrecer sobre esto.