最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

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

运维笔记admin13浏览0评论

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

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

我的Node.js文件夹层次结构看起来像下一个图像:

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 REQUEST,在页面中: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目录下的public_html目录中的Node.js文件中。

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

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

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

然后HTTP REQUEST将如下所示:

$.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
  }
});

请注意我已添加SERVER目录。而且,我可以交换

url: "server/user/verifytoken",

从远程应用程序(如Ionic)获取IP:

url: "123.123.123.123:443/server/user/verifytoken",

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

你怎么看?

谢谢!

回答如下:

首先让我说我不是专家。但我有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。我的答案是:取决于部署条件。
发布评论

评论列表(0)

  1. 暂无评论