bcrypt.compare() 或 bcrypt.compareSync()

bcrypt.compare() or bcrypt.compareSync()

我有一个关于这个主题的问题:

由于我的会员级别不允许发表评论,因此我不得不打开新主题。

我的问题是使用 bcrypt.compareSync() 而不是 bcrypt.compare().

的异步版本有什么缺点或有什么缺点吗?

compareSync() 绝对给出了正确的结果。那么为什么不使用它并使用包裹在 Promises 中的 compare() 呢?它会阻止 nodeJS 为其他用户提供服务吗?

Node.js 本机方法具有同步附加方法,如 fs.writeFileSynccrypto.hkdfSyncchild_process.execSync。 JavaScript 在浏览器中与所有需要线程阻塞的本机函数异步实现,但 Node.js 中的 Sync 方法实际上会阻塞线程,直到任务完成。

在Node.js中使用CallbackPromise时,如果只在内部执行异步逻辑,则可以在不停止主线程的情况下在处理其他任务的同时管理异步任务(使用 CallbakPromise.all 的计数)。

Sync方法在下班后运行下一行,因此很容易识别执行顺序并且易于编码。但是,主线程被阻塞,所以你一次不能做一个以上的任务。

想想下一个例子。

const syncFunc = () => {
  for (let i = 0; i < 100; i++) fs.readFileSync(`/files/${i}.txt`);
  console.log('sync done');
};

const promiseFunc = async () => {
  await Promise.all(Array.from({length: 100}, (_,i) => fs.promises.readFile(`/files/${i}.txt`)));
  console.log('promise done');
};

当读取所有 100 个 txt 文件没有问题时,promise 函数结束得更快。

这个Sync特性同样适用于C语言的库。如果您查看以下代码,您会发现 C++ 中实现的差异。

总而言之,我认为这是一个选择问题。如果您编写的代码是在单个线程上运行的逻辑,则使用 Sync 方法没有问题,如果主线程被阻塞(如简单宏)则无关紧要。但是,如果你正在做逻辑,其中服务器等性能问题很重要,并且主线程应该尽可能不停止线程或异步管理,你可以选择 PromiseCallback.

使用异步方法而不是同步方法的原因在项目的自述文件中有很好的解释。

Why is async mode recommended over sync mode?

If you are using bcrypt on a simple script, using the sync mode is perfectly fine. However, if you are using bcrypt on a server, the async mode is recommended. This is because the hashing done by bcrypt is CPU intensive, so the sync version will block the event loop and prevent your application from servicing any other inbound requests or events. The async version uses a thread pool which does not block the main event loop.

https://github.com/kelektiv/node.bcrypt.js#why-is-async-mode-recommended-over-sync-mode

因此,如果您在 Web 应用程序或其他不想阻塞主线程的环境中使用它,则应使用异步版本。