如何使用nodejs中的工作线程在mongoDB中插入新数据

问题描述

我想使用 worker thread

将数据插入到 mongoDB 中

现在我有一个工作文件,工作文件的全部目的是将数据保存到 mongoDB 中,而 mainjs 正在发送我想保存到 mongoDB 中的代理的名称

worker.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();

ma​​in.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))
})

当我尝试使用工作线程保存数据时,出现此错误

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)

当我在没有工作线程的情况下运行同一行代码时,它运行良好。

解决方法

您需要在工作线程中配置 mongoose 并连接到 MongoDB,因为 Worker 已经隔离了 env,即它自己的事件循环等。如果您使用 Worker 将数据保存到 MongoDB 只是为了学习目的那么就可以了,否则这里不使用 Worker。 Worker 仅在您需要执行长时间运行的同步任务时才有用,例如加密文件、调整图像大小或复杂的数据处理、对大数据进行排序等。

示例代码可以参考这篇文章 https://henrikgronvall.com/articles/nodejs-worker-threads/