适用于JAVA开发人员的NodeJS - 几个问题

时间:2015-06-16 06:12:14

标签: java node.js express

我正在开发一个基于json的项目。由于JAVA中90%的服务器端都是POJO.toJSON(),我决定给NodeJS一个机会!

我的大多数问题都与NodeJS作为单个线程运行的事实有关。

  1. 我是对的吗? :)
  2. NodeJS使用require(' something')。这是否意味着我可以将整个应用程序视为单个文件?
  3. 如果2为yes,则在整个应用程序中可以看到在函数外声明的变量。换句话说,如果我声明var dbConnection = ...;我可以从任何地方/任何文件访问dbConnection。不需要连接池?!?你能确认一下吗?
  4. 如果为true,则在所有请求之间共享单个连接。我期望对表演产生巨大影响。你能澄清一下吗?
  5. 我应该避免作为JAVA开发者获得的习惯吗?例如:如果我与数据库交换JSON(当然除了文档目的),DTO似乎毫无用处。
  6. 为什么我觉得每个人在看起来与我完全不同的时候会比较Angular和Express?如果我理解正确,Angular似乎很适合与服务器上运行的NodeJS / Express交换JSON。
  7. 谢谢!

2 个答案:

答案 0 :(得分:1)

1)节点正在使用Javascript,因此它是单线程且无阻塞的。

2)如果我理解正确你的意思..是的,你可以有一个文件申请。当应用程序变大时,这可能会让你的生活变得悲惨。

3)是的。这个变量可以通过文件访问。有关mysql的详细信息和代码,您可以使用此module

4)单个连接会在性能方面产生问题。你最好使用游泳池。再次在上面的链接上提供信息。

5)不知道。

6)Angular是客户端,express是服务器端,服务不同。有关明确herehere的信息。有关角here

的信息

答案 1 :(得分:0)

1)Node.JS不是单线程的。它使用多个线程。但是JavaScript虚拟机(在大多数情况下是V8)是单线程的(在某种程度上,有一些方法可以创建线程和进程)。所以JavaScript提供的任何调用大多是单线程的。但是,如果你想在异步编程Node.JS之外引入并行性,你可以在node.js下创建线程,进程和worker。

2)我不太确定你想在这里实现什么。如果问题是,“我可以将我的整个代码写入一个文件吗?”,是的,你可以。如果问题是,“要求将所有代码加载到一个应用程序中然后执行它吗?”,这是不对的。 CommonJS就是这样做的,但是在Node.JS中,它绑定到更低级别。 CommonJS行为是模拟的,但性能稍高。请记住,每个模块都在自己的范围内运行,并且它被缓存(因此它只加载一次,即使您从多个位置引用它)。即使是主要加载的应用程序实际上也被视为模块,并且在与其余部分隔离的自己的范围内运行。 Node的“全局”范围中存在很少的东西

3)看看我对问题2的回答。每个模块,包括你的主应用程序起点都在不同的范围内运行。他们都无法访问全球“全球”范围。有这样的事情,但不是为了方便访问。看看这个例子:

a.js:
globalVar = 1
global.myGlobal = 33
require('./b')

b.js:
console.log(global, global.globalVar, global.myGlobal);
console.log(globalVar)

如果您认为存在全球空间,如果您运行节点./a.js ,您将获得 globalVar 和<的值作为输出强> myGlobal 即可。但你不会。 因为每个模块都有自己的全局。 但是,由于缓存(模块只加载一次),如果需要一个可从多个模块和位置访问的全局变量,则可以使用模块执行此操作。

见这个例子:

a.js:
var b = require('./b');
console.log(b.sharedVariable++);
require('./c');

b.js:
sharedVariable=33;
module.exports = global

c.js:
var b = require('./b');
console.log(b.sharedVariable);

如果你用节点./a.js 运行它,你将得到33和34.这是唯一可行的,如果b模块只在内部加载一次,而所有其他调用只是得到参考它。如果那不是真的,你会得到33和33.这是一件好事。它不仅加速了节点,编译和加载过程,而且还为您提供了一种机制,可以根据需要通过专门设计的模块创建内部消息。无论如何,不​​要像这个例子那样实现你的模块。这个例子可以证明一点(本地化的全局命名空间和缓存)。编写模块有更好的模式:)

4)单一连接在什么意义上?节点不使用单个连接,也不提供此类连接。您可以很好地控制会话,可以打开许多连接,也可以根据需要重复使用,或者使用池。你可以做任何你喜欢的事。

5)不要写同步代码。将其拆分为尽可能小的任务,这将使应用程序的执行抖动更小。

6)我没有感觉Angular与Express相比。 Express只是Node.JS中使用的一种流行的HTTP路径路由器(并不是唯一的路由器),而AngularJS(主要)是在浏览器上运行的前端UI。他们一起工作,而不是互相攻击。即使您使用Angular Universal(服务器端Angular,在将其加载到浏览器之前预编译Angular代码的一部分),您仍可能需要在后端表达http路由器以便为您的REST查询提供服务。它们真的是不同的东西