无法在工作脚本中导入模块
Cannot import modules in worker script
我刚开始使用工作线程,在此先感谢您的帮助和时间。
使用节点 v12.22.4,mongodb v4.2.19
我想要实现的是:在客户端,用户请求一个大的 export/download 操作。服务器端在 db 上创建一个“任务”,使用烤面包机 + 任务 id 确认用户请求,然后 summons/creates 一个工作线程来进行计算。在计算期间,正在更新数据库上任务的状态。
客户端收到任务 ID,因此他可以 ping 服务器以询问计算进度。一旦工作完成(数据库中的状态相当于完成),客户端就会通过最终请求询问结果。
以下是我如何从 'export.controller.js' 脚本中召唤新工人:
const {Worker} = require('worker_threads');
const worker = new Worker("./server/api/export/export.worker.js", {execArgv : [...process.execArgv, '--unhandled-rejections=strict']});
问题是,在我的工作脚本 ('export.worker.js') 上,我需要查询集合(使用 mongodb),所以我导入了所需的模型。我应该提一下,我创建的模型。
但是我在 require 行收到这个错误:
Error: Cannot find module 'components/model'
[1] Require stack:
[1] - path\server\models\api\api.model.js
[1] - path\server\api\export\export.worker.js
[1] at Function.Module._resolveFilename (internal/modules/cjs/loader.js:815:15)
[1] at Function.Module._load (internal/modules/cjs/loader.js:667:27)
[1] at Module.require (internal/modules/cjs/loader.js:887:19)
[1] at require (internal/modules/cjs/helpers.js:74:18)
[1] at Object.<anonymous> (path\server\models\api\api.model.js:3:24)
[1] at Module._compile (internal/modules/cjs/loader.js:999:30)
[1] at Object.Module._extensions..js (internal/modules/cjs/loader.js:1027:10)
[1] at Module.load (internal/modules/cjs/loader.js:863:32)
[1] at Function.Module._load (internal/modules/cjs/loader.js:708:14)
[1] at Module.require (internal/modules/cjs/loader.js:887:19)
[1] at require (internal/modules/cjs/helpers.js:74:18)
[1] at Object.<anonymous> (path\server\api\export\export.worker.js:5:14)
[1] at Module._compile (internal/modules/cjs/loader.js:999:30)
[1] at Object.Module._extensions..js (internal/modules/cjs/loader.js:1027:10)
[1] at Module.load (internal/modules/cjs/loader.js:863:32)
[1] at Function.Module._load (internal/modules/cjs/loader.js:708:14) {
[1] code: 'MODULE_NOT_FOUND',
[1] requireStack: [
[1] 'path\server\models\api\api.model.js',
[1] 'path\server\api\export\export.worker.js'
[1] ]
}
在我的 'export.worker.js' 脚本中用这一行引发:
const Apis = require('../../models/api/api.model.js');
我还应该提一下,之前所有的事情都是直接在服务器端处理的,但是这样做我无法检查我的计算进度状态。因此使用工作线程。
非常感谢。
遇到同样问题的人:
确实跟路径有关。我试图导入的模块 'api.model.js' 正在引用另一个模块 'components/model' 引用另一个模块......等等 - 但所有引用都没有相对路径。我在我的项目中使用了 webpack,因此它在一个线程上运行良好,但似乎无法使用工作线程。
我最终找到了解决方法:我简化了我的 'api.model.js' 文件,这样它就不再引用 'components/model' 文件了。另一种选择是用相关路径替换每条路径(我的项目在这里太大,我没有耐心这样做)。
祝你好运!
我刚开始使用工作线程,在此先感谢您的帮助和时间。
使用节点 v12.22.4,mongodb v4.2.19
我想要实现的是:在客户端,用户请求一个大的 export/download 操作。服务器端在 db 上创建一个“任务”,使用烤面包机 + 任务 id 确认用户请求,然后 summons/creates 一个工作线程来进行计算。在计算期间,正在更新数据库上任务的状态。 客户端收到任务 ID,因此他可以 ping 服务器以询问计算进度。一旦工作完成(数据库中的状态相当于完成),客户端就会通过最终请求询问结果。
以下是我如何从 'export.controller.js' 脚本中召唤新工人:
const {Worker} = require('worker_threads');
const worker = new Worker("./server/api/export/export.worker.js", {execArgv : [...process.execArgv, '--unhandled-rejections=strict']});
问题是,在我的工作脚本 ('export.worker.js') 上,我需要查询集合(使用 mongodb),所以我导入了所需的模型。我应该提一下,我创建的模型。
但是我在 require 行收到这个错误:
Error: Cannot find module 'components/model'
[1] Require stack:
[1] - path\server\models\api\api.model.js
[1] - path\server\api\export\export.worker.js
[1] at Function.Module._resolveFilename (internal/modules/cjs/loader.js:815:15)
[1] at Function.Module._load (internal/modules/cjs/loader.js:667:27)
[1] at Module.require (internal/modules/cjs/loader.js:887:19)
[1] at require (internal/modules/cjs/helpers.js:74:18)
[1] at Object.<anonymous> (path\server\models\api\api.model.js:3:24)
[1] at Module._compile (internal/modules/cjs/loader.js:999:30)
[1] at Object.Module._extensions..js (internal/modules/cjs/loader.js:1027:10)
[1] at Module.load (internal/modules/cjs/loader.js:863:32)
[1] at Function.Module._load (internal/modules/cjs/loader.js:708:14)
[1] at Module.require (internal/modules/cjs/loader.js:887:19)
[1] at require (internal/modules/cjs/helpers.js:74:18)
[1] at Object.<anonymous> (path\server\api\export\export.worker.js:5:14)
[1] at Module._compile (internal/modules/cjs/loader.js:999:30)
[1] at Object.Module._extensions..js (internal/modules/cjs/loader.js:1027:10)
[1] at Module.load (internal/modules/cjs/loader.js:863:32)
[1] at Function.Module._load (internal/modules/cjs/loader.js:708:14) {
[1] code: 'MODULE_NOT_FOUND',
[1] requireStack: [
[1] 'path\server\models\api\api.model.js',
[1] 'path\server\api\export\export.worker.js'
[1] ]
}
在我的 'export.worker.js' 脚本中用这一行引发:
const Apis = require('../../models/api/api.model.js');
我还应该提一下,之前所有的事情都是直接在服务器端处理的,但是这样做我无法检查我的计算进度状态。因此使用工作线程。
非常感谢。
遇到同样问题的人:
确实跟路径有关。我试图导入的模块 'api.model.js' 正在引用另一个模块 'components/model' 引用另一个模块......等等 - 但所有引用都没有相对路径。我在我的项目中使用了 webpack,因此它在一个线程上运行良好,但似乎无法使用工作线程。
我最终找到了解决方法:我简化了我的 'api.model.js' 文件,这样它就不再引用 'components/model' 文件了。另一种选择是用相关路径替换每条路径(我的项目在这里太大,我没有耐心这样做)。 祝你好运!