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



我想使用worker thread将数据插入mongoDB

现在我有一个worker文件,worker文件的全部目的是将数据保存到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();

main.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:nodeinsuredminenode_modulesmongooselibdriversnode-mongodb-nativecollection.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已经隔离了它自己的事件循环等。如果你使用一个Worker来保存数据到MongoDB只是为了学习的目的,那么它是可以的,否则这里不使用Worker。Workers仅在需要执行长时间运行的同步任务时有用,例如加密文件、调整图像大小或复杂数据处理、对大数据进行排序等。

您可以参考本文中的示例代码https://henrikgronvall.com/articles/nodejs-worker-threads/

最新更新