我正在开发一个基于json的项目。由于JAVA中90%的服务器端都是POJO.toJSON(),我决定给NodeJS一个机会!
我的大多数问题都与NodeJS作为单个线程运行的事实有关。
谢谢!
答案 0 :(得分:1)
1)节点正在使用Javascript,因此它是单线程且无阻塞的。
2)如果我理解正确你的意思..是的,你可以有一个文件申请。当应用程序变大时,这可能会让你的生活变得悲惨。
3)是的。这个变量可以通过文件访问。有关mysql的详细信息和代码,您可以使用此module
4)单个连接会在性能方面产生问题。你最好使用游泳池。再次在上面的链接上提供信息。
5)不知道。
的信息答案 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查询提供服务。它们真的是不同的东西