工作人员无法查询/访问猫鼬模型

时间:2020-07-01 13:33:44

标签: node.js web-worker node-worker-threads

我尝试直接在工作人员中导入Mongoose模型,例如:

  Worker, isMainThread, parentPort, workerData
} = require('worker_threads');

if (isMainThread) {
  module.exports = function parseJSAsync(script) {
    return new Promise((resolve, reject) => {
      const worker = new Worker(__filename, {
        workerData: null
      });
      worker.on('message', resolve);
      worker.on('error', reject);
      worker.on('exit', (code) => {
        if (code !== 0)
          reject(new Error(`Worker stopped with exit code ${code}`));
      });
    });
  };
} else {
  const MyModel = require("../models/MyModel.js");
  const data = await MyModel.find();
}

查询未运行!但没有例外或错误

因此,我尝试从主线程将模型作为WorkerData传递:

const {
  Worker, isMainThread, parentPort, workerData
} = require('worker_threads');

const MyModel = require("../models/MyModel.js");

if (isMainThread) {
  module.exports = function parseJSAsync(script) {
    return new Promise((resolve, reject) => {
      const worker = new Worker(__filename, {
        workerData: MyModel
      });
      worker.on('message', resolve);
      worker.on('error', reject);
      worker.on('exit', (code) => {
        if (code !== 0)
          reject(new Error(`Worker stopped with exit code ${code}`));
      });
    });
  };
} else {
  
  const MyModel = workerData;
  const data = await MyModel.find();
}

这次我得到了例外:

DOMException [DataCloneError]: function model(doc, fields, skipId) {
      model.hooks.execPreSync('createModel', doc);
      if (!(this insta...<omitted>... } could not be cloned.
    at new Worker (internal/worker.js:144:17)

我该怎么做才能从Worker线程访问数据库?

我应该使用以下命令在线程内建立与数据库的单独连接: mongoose.connect()吗?

1 个答案:

答案 0 :(得分:0)

我不知道您是否解决了您的问题,但是我也有同样的看法,对于到达这里的人们,解决方案是: 作为事实(例如@jackOfAll):与数据库建立连接

相关问题