В какой-то момент для некоторых тяжёлых операций вы начинаете задумываться о том, что в ноде не хватает возможности создавать дочерние потоки/процессы. И вот вы обновляетесь до последней версии Node.js, прикручиваете worker_threads, и…
Какие-то либы отваливаются. В частности, отваливается bcrypt, но только на Windows, на Ubuntu полёт нормальный.
Накидал небольшой проект для примера.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
'use strict'; const {Worker, isMainThread} = require('worker_threads'); if (isMainThread) console.log("I'm ok, because I'm alpha main"); else console.log("I'm sad, because I can't load bcrypt"); const BCRYPT_SALT_ROUNDS = 12; const bcrypt = require('bcrypt'); function runTestWorker(workerData) { return new Promise((resolve, reject) => { const worker = new Worker('./index.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 testHash() { const hash = await bcrypt.hash("test_password", BCRYPT_SALT_ROUNDS); const ok = await bcrypt.compare("test_password", hash); console.log(ok ? "same" : "different"); } async function run() { const result = await runTestWorker('I will crash your app (。•́︿•̀。)'); console.log(result); } testHash() .then(() => { if (isMainThread) run().catch(err => console.error(err)); }); |
Падает с таким логом:
1 2 3 4 5 6 7 8 9 10 11 |
Error: Module did not self-register. at Object.Module._extensions..node (internal/modules/cjs/loader.js:779:18) at Module.load (internal/modules/cjs/loader.js:630:32) at tryModuleLoad (internal/modules/cjs/loader.js:570:12) at Function.Module._load (internal/modules/cjs/loader.js:562:3) at Module.require (internal/modules/cjs/loader.js:667:17) at require (internal/modules/cjs/helpers.js:20:18) at Object.<anonymous> (O:\Texts\Sources\my\bcrypt-shild-process\node_modules\bcrypt\bcrypt.js:6:16) at Module._compile (internal/modules/cjs/loader.js:738:30) at Object.Module._extensions..js (internal/modules/cjs/loader.js:749:10) at Module.load (internal/modules/cjs/loader.js:630:32) |
Создал тикет, может и поправят. Пока как воркэраунд, если вам, конечно, не нужен bcrypt в дочернем процессе, можно обойтись проверкой на мейн тред:
1 2 3 4 5 6 |
const {Worker, isMainThread} = require('worker_threads'); if (isMainThread) console.log("Делаем что-то с bcrypt"); else console.log("В дочернем процессе не используем bcrypt"); |