我应该使用express static dirname还是使用Node.js作为远程服务器?

时间:2017-12-27 16:17:40

标签: node.js express

My Node.js文件夹hirarchy看起来像下一张图片:

My folders hirarchy

虽然app.js是Node.js主文件,routes是Node.js路由,src是客户端公共html文件。

这是app.js中的代码:

var express = require('express');
var app = express();
var server = require('http').createServer(app);
global.io = require('socket.io').listen(server);
var compression = require('compression');
var helmet = require('helmet');
var session = require('express-session');

var bodyParser = require('body-parser');
app.use(bodyParser.json()); // support json encoded bodies
app.use(bodyParser.urlencoded({ extended: true })); // support encoded bodies

app.use(express.static(__dirname + '/src'));

app.use(helmet());
app.use(compression());

app.use('/rides', require('./routes/ridesServer'));
app.use('/user', require('./routes/userServer'));
app.use('/offers', require('./routes/offersServer'));
app.use('/notifications', require('./routes/notificationsServer'));

server.listen("8080", function() {
  console.log("Connected to db and listening on port 8080");
});

这是routes/userServer.js文件中的另一个API:

router.post('/verifytoken', function(req, res, next) {

  // some functions here

});

这是我在客户端进行的另一个HTTP请求,在页面中:ride.js

$.ajax({
  method: "POST",
  headers: {
    "Content-Type": "application/json"
  },
  url: "user/verifytoken",
  data: JSON.stringify(something),
  success: function(response) {
    // some code
  },
  error: function(error) {
    // some code
  }
});

如您所见,客户端文件和Node.js服务器文件位于同一服务器上,Node.js通过此命令提供这些静态文件:

app.use(express.static(__dirname + '/src'));

我认为应该避免,并且有更好的方法!

如果您是Node.js专家和最佳实践家庭,请告诉我下一个工作方法是否正确,如果没有,请纠正我:

我考虑过在public_html目录下放置静态文件 和server目录下的{。{}}目录下的Node.js文件。

然后在public_html目录中的app.js上运行pm2 start app.js --watchnode app.js,而不是server

结果,public_html文件将作为另一个静态文件提供,与Node.js服务器没有任何关系,Node.js将在自己的文件夹中,不处理任何类型的客户端

换句话说,分离Node.js和静态文件,并将Node.js文件作为子目录而不是主目录。

然后HTTP REQUEST将如下所示:

index.html

请注意我添加了 SERVER 目录。 此外,我可以交换

$.ajax({
  method: "POST",
  headers: {
    "Content-Type": "application/json"
  },
  url: "server/user/verifytoken",
  data: JSON.stringify(something),
  success: function(response) {
    // some code
  },
  error: function(error) {
    // some code
  }
});

来自远程应用程序的IP(如Ionic):

url: "server/user/verifytoken",

然后我的HTTP REQUESTS将通过HTTPS提供(因为我发送的是端口443),我可以在同一台服务器上创建多个应用程序,而且我没有与任何Node.js表达静态文件夹的斗争。

您怎么看?

谢谢!

1 个答案:

答案 0 :(得分:1)

首先让我说我不是专家。但我有3年不断开发基于Node.js的解决方案。

过去我创建了在同一个项目中混合客户端代码和服务器端代码的解决方案,并且它有效。至少有一段时间了。但从长远来看,出于许多可能的原因,这是一个坏主意。其中一些是:

  • 客户端代码和服务器端代码可能需要不同的进程来生成工作代码。例如,客户端代码可能需要使用gulp或Webpack等方式从ES6到更兼容的ES5进行反编译。服务器端代码通常不是这种情况,因为运行时更具针对性。
  • 混合客户端代码和API服务器可能会阻止您在没有另一个的情况下水平扩展其中一个。
  • 这就像一个单声道回购。对于这种情况,没有CI流程定制的单一仓库可能会产生很长的开发时间。

我们目前在工作中所做的工作如下:

  • 创建单独的API服务器项目。这样,您可以在处理此特定项目时专注于开发良好的API。让API服务器外部的横切关注点(如身份验证)。
  • 为您的客户端代码创建一个单独的项目(可能是SPA)。将您的开发环境设置为代理API请求到正在运行的API服务器(可能在本地运行)。
  • 为整个解决方案的部署创建一个单独的项目。该项目将整合客户代码的服务,代理API的请求,并实现认证等交叉问题。

以这种方式分离代码可以轻松开发每个部分并快速演变。但它可能会带来一些复杂性:

  • 这个多项目结构要求您能够在每次项目更改时触发测试孔产品。
  • 它表明了集成测试的需要

其他一些考虑因素是:

  • API服务器和网站服务器可以在同一台计算机上运行但在不同的端口上运行。
  • 您可以使用SSL保护您的API服务器(在使用标准https模块的节点上),但请注意,在所有情况下,您需要在API服务器前面的另一个actor(代理对实际API服务器的请求的网站)实现交叉问题的API网关,如身份验证,速率限制等)。在过去,我提出了与您在此方案中使用SSL相关的问题,答案是here。我的答案是:取决于部署条件。