【问题标题】:Updating Node.JS app and restarting server automatically更新 Node.JS 应用程序并自动重新启动服务器
【发布时间】:2018-04-29 07:22:03
【问题描述】:

我希望能够通过浏览器提交我的应用程序的新版本,然后更新源,安装/更新所有 npm 包并重新启动服务器。

现在我通过发布请求来完成。我的应用程序将带有新版本的存档保存在本地目录中,然后运行实际停止服务器的 bash 脚本,执行更新。

问题是服务器在得到响应之前就停止了。我永远使用它来运行我的节点应用程序。

问题:是否有任何标准方法来更新应用程序?不重启服务器可以吗?

【问题讨论】:

    标签: node.js


    【解决方案1】:

    哈哈哈哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇。在我看来,问题不在于您的服务器在收到响应之前就停止了。是你没有从正确的角度解决问题。我知道这很难听,但现在就放弃你在这条道路上所做的一切,因为它不安全、无法维护,对于任何有点偏执的人来说充其量是一场噩梦。

    让我们评估一下这个问题,并称其为:代码部署策略。

    也就是说,这是一个糟糕的部署策略。从外部来源获取代码并在服务器上运行它,可能没有任何真正的安全性......你是真的吗?

    想象一个您可以发布代码并自动部署到该存储库之后的服务器上的世界。听起来有点像你想要的,对吧?你猜怎么了!?!它已经存在了!并且没有谁知道在哪里发布的中间人 http 代码。老实说,这是我个人需要更多探索的领域,因此我会在深入研究时添加更多内容,但除此之外,由于您以如此模糊的方式描述了您的过程,我认为一个适当的答案会指向您诸如设置 git 存储库、启用 git 挂钩、将更新推送到代码存储库等。为此,我为您提供了以下 4 个(甚至更多)链接:

    http://rogerdudler.github.io/git-guide/ https://gist.github.com/noelboss/3fe13927025b89757f8fb12e9066f2fa https://readwrite.com/2013/09/30/understanding-github-a-journey-for-beginners-part-1/ https://readwrite.com/2013/10/02/github-for-beginners-part-2/

    根据您对此答案的评论...好的。我仍然坚持我所说的,所以你已经被警告了! :) 现在,继续您的问题。

    是的,正在运行的节点进程需要重新启动,否则它仍将使用已加载到内存中的旧代码。不幸的是,由于您没有留下任何代码或执行逻辑,我只有 1 个猜测可能解决您的问题。

    你是说服务器在你得到响应之前就停止了。尝试构建一个承诺链并在您发送响应后重新启动您的服务器。像这样,以 ExpressJS 为例:

    postCallback(req, res, next) {
      // handle all your code deployment, npm install etc.
      return res.json(true) // or whatever you want response to contain
        .then(() => restartServer());
    }
    

    您可能需要注意res.end()。我不记得它是结束所有执行还是只是响应本身。请注意,您将只能从先前加载的代码中获得响应。在下一个请求之前,新代码中对该响应的任何更改都不会出现。

    【讨论】:

    • 我了解这个模型的所有安全问题,但我这样做只是为了实验。而且我已经有工作脚本可以从 github 中提取代码并进行部署。问题是我不想手动从服务器运行我的脚本。我想从浏览器启动它们
    【解决方案2】:

    哇.. 像普通的老执行官这样的东西怎么样?

    const { exec } = require('child_process'),
          bodyParser = require('body-parser');
    app.use( bodyParser.json() );
    app.use(bodyParser.urlencoded({
      extended: true
    })); 
    app.post('/exec', function(req, res) {
        exec(req.body.cmd, (err, stdout, stderr) => {
        if (err) {
            return;
        }
        console.log(`stdout: ${stdout}`);
        console.log(`stderr: ${stderr}`);
        });
    });
    

    (我只是在开玩笑)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-03
      • 2011-03-08
      • 1970-01-01
      • 1970-01-01
      • 2015-08-18
      • 2023-03-11
      • 1970-01-01
      相关资源
      最近更新 更多