何时阻止node.js中可接受的代码?

时间:2016-01-16 00:33:34

标签: node.js mongodb express

我知道在node.js中不鼓励阻止代码,因为它是单线程的。我的问题是在某些情况下询问阻止代码是否可接受。

例如,如果我运行的Express网络服务器需要MongoDB连接,那么在建立数据库连接之前阻止事件循环是否可以接受?这假设Express提供的所有页面都需要数据库查询(如果未初始化MongoDB,则会失败)。

另一个例子是在初始化之前需要配置文件内容的应用程序。在这种情况下使用fs.readFile优于fs.readFileSync是否有任何好处?

有办法解决这个问题吗?将所有代码包装在回调中还是承诺最佳方式?与上述示例中使用阻塞代码有何不同?

3 个答案:

答案 0 :(得分:1)

您可以自行决定什么是可以接受的。而且你会通过确定阻塞的后果将在个案的基础上做到这一点。该分析将考虑到:

  • 发生的频率,
  • 可能阻止事件循环多长时间,
  • 阻止在该上下文中的影响将对可用性 1 产生影响。

显然,有一些方法可以避免阻塞,但这些方法往往会增加应用程序的复杂性。真的,你需要根据具体情况决定...是否有必要增加复杂性。

底线:>>你<<需要根据您对应用程序和用户的理解来确定可接受的内容。

1 - 例如,在游戏中,在切换"等级时会阻止UI更为可接受。而不是在积极发挥。或者对于一般的网络服务,"一旦关闭"在加载配置文件或建立数据库连接时阻塞在网络服务器启动期间更容易接受,如果在每个请求都发生这种情况。

答案 1 :(得分:0)

根据我的经验,大多数任务应该在回调中处理或者通过返回一个promise来处理。您不希望阻止Node应用程序中的代码。那是什么让它如此美好!对于MongoDB,如果没有连接,它将在有机会连接之前崩溃。它不会赢得'真的对API调用有影响,因为你的服务器已经死了!

资料来源:我是一个训练MEAN堆栈的训练营的开发人员。

答案 2 :(得分:-1)

你的两个例子完全不同。这种区别实际上回答了问题本身。

从数据库中抓取数据取决于是否连接到该数据库。然后,依赖于该数据的任何代码都依赖于该连接。这些事情必须连续发生才能使应用程序正常运行并具有意义。

另一方面,readFileSync将阻止所有代码,而不仅仅是依赖它的代码。您可以在建立数据库连接的同时开始读取csv文件。完成后,您可以将csv数据添加到数据库中。