Quiero insertar datos en mongoDB usando worker thread
de trabajo
En este momento tengo un archivo de trabajo, el propósito completo del archivo de trabajo es guardar los datos en mongoDB y mainjs está enviando el nombre del agente que quiero guardar en mongoDB
trabajador.js
const { workerData, parentPort } = require('worker_threads') const Agent = require('../models/agent') console.log("Worker thread is running like a hell: ", workerData) const processRecord = async () => { const agent = new Agent({agent:workerData}) try { await agent.save() }catch(e) { console.log(e) } } processRecord();
principal.js
const express = require('express') const router = new express.Router() const { Worker } = require('worker_threads') router.post('/agent', async (req, res) => { function runService(workerData) { return new Promise((resolve, reject) => { const worker = new Worker('../src/router/worker.js', { workerData }); worker.on('message', resolve); worker.on('error', reject); worker.on('exit', (code) => { if (code !== 0) reject(new Error(`Worker stopped with exit code ${code}`)); }) }) } async function run() { const result = await runService('john wick') console.log("this is from main thread " + result); } run().catch(err => console.error(err)) })
Cuando trato de guardar los datos usando un subproceso de trabajo, aparece este error:
MongooseError: Operation `agents.insertOne()` buffering timed out after 10000ms at Timeout.setTimeout (F:\node\insuredmine\node_modules\mongoose\lib\drivers\node-mongodb-native\collection.js:184:20) at ontimeout (timers.js:436:11) at tryOnTimeout (timers.js:300:5) at listOnTimeout (timers.js:263:5) at Timer.processTimers (timers.js:223:10)
y cuando ejecuto la misma línea de código sin subproceso de trabajo, funciona bien.
Necesitaría configurar mongoose
y conectarse a MongoDB
dentro de un subproceso de trabajo porque Worker ha aislado env ie su propio ciclo de eventos, etc. aquí. Los trabajadores solo son útiles cuando tiene tareas sincrónicas de larga duración para realizar, por ejemplo, cifrar un archivo, cambiar el tamaño de una imagen o procesamiento de datos complejos, clasificar datos grandes, etc.
Puede consultar este artículo para ver el código de ejemplo https://henrikgronvall.com/articles/nodejs-worker-threads/