如何将express服务器代码与express业务逻辑代码分离



我学习的所有Node.js教程都将所有内容放在一个文件中。它包括导入库、路由、数据库连接和启动服务器,例如express.js:

var app = require('express');
app.get('/somePath', blah blah);
app.listen(...);

现在,我在Nginx负载均衡器后面有4个节点服务器。然后很难在所有四台服务器上更新源代码。

有没有一种方法可以将源代码排除在服务器创建代码之外,这样我就可以将源码作为一个包部署在服务器上?服务器创建代码不应该知道任何关于路由或数据库连接的信息。它应该只监听文件夹中的更改,当新的模块元文件出现时,它就开始托管该web应用程序。

就像我们如何部署Maven打包为war并部署到Tomcat的webapp中的Java代码一样,因为Tomcat实例化不是源代码的一部分。在node.js中,服务器似乎也是源代码的一部分。

目前,包装不是我关心的问题。我关心的是如何分离逻辑,以及如何将所有服务器指向一个源代码库?

Node.js或JavaScript没有类似WAR的概念。但它确实有一些相似之处。为了实现类似WAR的功能,您基本上会使用类似webpack的东西将代码捆绑到一个源文件中。然而,这可能不适用于像http这样的Node.js模块(Express使用`http,因为它可能调用或依赖于本机V8/C++函数/库

您也可以使用Docker,并将Docker容器视为WAR。

以下是我的解决方案:

  1. 将服务器放在一个文件夹下,比如"server_clusters",并将不同的节点服务器放在那里,即:node1.js、node2.js、node3.js、节点4.js等(我知道,在现实世界中,集群可能是不同的VM或CPU,但目前,我只想将服务器创建逻辑与源代码分开)。这些文件的代码片段如下:

    var常量=require('./prop')
    var appBasePath=常量。APP_BASE_DIR;var appFilePath=appBasePath+"/main";

    var app=require(appFilePath);

    //每个服务器只有不同的端口号,而其他所有服务器都保持不变app.侦听(8080,函数(req,res){console.log("服务器启动");});

  2. 创建一个具有源代码路径的属性文件,然后导出对象。就这么简单。这是上面代码中第1行使用的内容

  3. 在机器上任意位置创建源目录项目,只需更新上面常量文件中的主目录即可。源代码目录可以导出一个着陆文件,该文件将向服务器提供express应用程序以启动:

    var express=require('express')
    var app=express();

    module.exports=应用程序;

这样,就有多个服务器指向同一源代码。

希望这对那些面临同样问题的人有所帮助。欢迎采用其他方法。

最新更新