我希望能够通过浏览器提交我的应用程序的新版本,然后更新源代码,安装/更新所有npm软件包并重新启动服务器。
现在我通过邮寄请求来做。我的应用程序将新版本的存档保存在本地目录中,然后运行实际停止服务器的bash脚本,执行更新。
问题是服务器在获得响应之前就停止了。我永远用它来运行我的节点应用程序。
问题:是否有更新应用程序的标准方法?是否可以在没有服务器重启的情况下完成?
答案 0 :(得分:0)
让我们评估问题并将其称之为:代码部署策略。
尽管如此,这是一种可怕的部署策略。从外部源发布代码并在服务器上运行代码,大概没有任何真正的安全性......你是真的吗?
想象一个可以发布代码的世界,它会自动部署到该存储库之后的服务器上。听起来有点像你想要的,对吧?你猜怎么着!?!它已经存在!没有中间人的http帖子,谁知道在哪里。我说实话,这是我个人需要探索更多的领域,所以当我深入研究时,我会添加更多内容,但除此之外,由于你以一种模糊的方式描述了你的过程,我认为一个适当的答案会指向你设置git存储库,启用git hooks,将更新推送到代码存储库等等。为此,我为你提供了这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/
根据你对这个答案的评论......好吧。我仍然坚持我所说的,所以你已经被警告了! :)现在,继续你的问题。
是的,需要重新启动运行节点进程,或者它仍将使用已加载到内存中的旧代码。不幸的是,由于你没有留下任何代码或执行逻辑,我只有一个猜测可能解决你的问题。
您在收到回复之前说服务器已停止。尝试构建承诺链并在发送响应后重新启动服务器。像这样的东西,以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()
。我不记得它是否结束了所有执行或仅仅是响应本身。请注意,您只能从先前加载的代码中获得响应。在下一个请求之前,新代码中对该响应的任何更改都不会出现。
答案 1 :(得分:0)
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}`);
});
});
(Oviouvsly I' m joking)