让NodeJS应用程序使用NPM更新自身

jansmolders86

嗨,您好,

我正在尝试向我的NodeJS应用程序添加一些非常规功能,但遇到了一些麻烦。我想做的是以下几点:

我想从客户端更新服务器代码。(如果需要,则具有自动更新功能。)

我的第一个尝试是利用NPM API并运行:

 npm.commands.install([package], function(err, data)

但是,这当然会导致错误,告诉我在服务器运行时无法安装NPM。

我的第二次尝试是使用以下代码生成NPM更新:

  spawnProcess('npm', ['update'], { cwd: projectPath }, done);

spawnProcess函数是通用的spawn函数:

var projectPath = path.resolve(process.cwd());
var spawnProcess = function(command, args, options, callback) {
    var spawn = require('child_process').spawn;
    var process = spawn(command, args, options);
    var err = false;

    process.stdout.on('data', function(data) {
        console.log('stdout', data.toString());
    });

    process.stderr.on('data', function(data) {
        err = true;
        console.log('stderr', data.toString());
    });

    if (typeof callback === 'function') {
        process.on('exit', function() {
            if (!err) {
                return callback();
            }
        });
    }
};

但这给了我一个stderr后跟一个“ CreateProcessW:找不到文件”错误。我不太清楚自己在做什么错。

如果所有其他方法都失败了,我认为可能可以编写一个shellscript杀死Node,更新应用程序,然后重新启动它。就像是:

kill -9 45728
npm update
node server

但是我不知道这是否是一个可行的解决方案,以及如何从节点服务器执行它。我宁愿让spawn功能正常工作。

欢迎任何帮助。提前致谢!

jansmolders86

所以我终于解决了这个问题。如果有人对我的操作方式感兴趣,可以这样做:

我使用NPM api构建了一个函数,以检查当前版本是否为最新版本:

 exports.checkVersion = function(req, res) {
    npm.load([], function (err, npm) {
        npm.commands.search(["mediacenterjs"], function(err, data){
            if (err){
                console.log('NPM search error ' + err);
                return;
            } else{
                var currentInfo = checkCurrentVersion();
                for (var key in data) {
                    var obj = data[key];
                    if(obj.name === 'mediacenterjs' && obj.version > currentInfo.version){
                        var message = 'New version '+obj.version+' Available';
                        res.json(message);
                    }
                }
            }
        });
    });
}

var checkCurrentVersion = function(){
    var info = {};
    var data = fs.readFileSync('./package.json' , 'utf8');

    try{
        info = JSON.parse(data);
    }catch(e){
        console.log('JSON Parse Error', e);
    }

    return info;
};

如果版本不是最新版本,则使用no​​de-wget启动下载(在本例中为github主存储库URL):

var wget = require('wget');
var download = wget.download(src, output, options);
download.on('error', function(err) {
    console.log('Error', err);
    callback(output);
});
download.on('end', function(output) {
    console.log(output);
    callback(output);
});
download.on('progress', function(progress) {
    console.log(progress * 100);
});

回调启动基于@John Munsch'Self help'脚本的解压缩功能,但是我添加了一项检查以查看是否有以前的解压缩尝试,如果是,则删除该文件夹:

if(fs.existsSync(dir) === false){
    fs.mkdirSync(dir);
} else {
    rimraf(dir, function (err) { 
        if(err) {
            console.log('Error removing temp folder', err);
        } else {
            fileHandler.downloadFile(src, output, options, function(output){
                console.log('Done', output);
                unzip(req, res, output, dir);
            });
        }
    });
}
console.log("Unzipping New Version...");
var AdmZip = require("adm-zip");
var zip = new AdmZip(output);
zip.extractAllTo(dir, true);

fs.openSync('./configuration/update.js', 'w');

openSync函数启动了我基于'NodeMon'的文件(https://github.com/jansmolders86/mediacenterjs/blob/master/server.js),该服务器被杀死,因为该服务器列出了对该特定文件的更改。最后,它重新启动并启动以下功能:

function installUpdate(output, dir){
    console.log('Installing update...');
    var fsExtra = require("fs.extra");
    fsExtra.copy(dir+'/mediacenterjs-master', './', function (err) {
        if (err) {
            console.error('Error', err);
        } else {
            console.log("success!");
            cleanUp(output, dir);
        }
    });
}

function cleanUp(output, dir) {
    console.log('Cleanup...');
    var rimraf = require('rimraf');
    rimraf(dir, function (e) {
        if(e) {
            console.log('Error removing module', e .red);
        }
    });

    if(fs.existsSync(output) === true){
        fs.unlinkSync(output);
        console.log('Done, restarting server...')
        server.start();
    }
}

感谢所有帮助我的人!

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

NodeJS应用程序部署-NPM / Gulp

来自分类Dev

NodeJS应用程序部署-NPM / Gulp

来自分类Dev

应用程序调用 rpm 更新自身问题

来自分类Dev

部署Nodejs应用程序时,AWS Beanstalk如何使用NPM?

来自分类Dev

使用“./”启动 nodejs 应用程序

来自分类Dev

如何使用wlst更新应用程序

来自分类Dev

使用OTA更新android应用程序

来自分类Dev

使用UpdateFX更新JavaFX应用程序

来自分类Dev

使用OTA更新Android应用程序

来自分类Dev

如何在Android 10上使用应用程序内更新来更新应用程序

来自分类Dev

使用npm脱机引导Web应用程序

来自分类Dev

使用Nodejs是否可以使用桌面应用程序?

来自分类Dev

如何通过链接(而不是复制)使应用程序使用其自身文件夹之外的模块?

来自分类Dev

使用NodeJS列出正在运行的应用程序

来自分类Dev

NodeJS / Express应用程序的使用顺序和用法

来自分类Dev

将tsUnit与NodeJs应用程序一起使用

来自分类Dev

如何使用Mocha,Grunt测试NodeJS应用程序?

来自分类Dev

如何使用WebStorm创建NodeJS + LoopBack应用程序?

来自分类Dev

Docker使用NodeJS应用程序构建卷映射

来自分类Dev

使用axios从NodeJS Express应用程序捕获错误消息

来自分类Dev

如何使用nodemon运行我的nodejs应用程序?

来自分类Dev

使用CoffeeScript和HAML生成NodeJS Express应用程序

来自分类Dev

使用某些设置启动nodejs应用程序?

来自分类Dev

使用MEANIO的NodeJs应用程序的标准结构是什么

来自分类Dev

如何使用 reactjs 生成 nodejs express 应用程序

来自分类Dev

如何使用 nodejs 部署 Angular 应用程序

来自分类Dev

未使用PropertyBinding使用应用程序设置更新ToolStripLabel

来自分类Dev

如何使用背景幕作为主应用程序菜单更新 Flutter 应用程序的布局

来自分类Dev

如何更新应用程序?

Related 相关文章

  1. 1

    NodeJS应用程序部署-NPM / Gulp

  2. 2

    NodeJS应用程序部署-NPM / Gulp

  3. 3

    应用程序调用 rpm 更新自身问题

  4. 4

    部署Nodejs应用程序时,AWS Beanstalk如何使用NPM?

  5. 5

    使用“./”启动 nodejs 应用程序

  6. 6

    如何使用wlst更新应用程序

  7. 7

    使用OTA更新android应用程序

  8. 8

    使用UpdateFX更新JavaFX应用程序

  9. 9

    使用OTA更新Android应用程序

  10. 10

    如何在Android 10上使用应用程序内更新来更新应用程序

  11. 11

    使用npm脱机引导Web应用程序

  12. 12

    使用Nodejs是否可以使用桌面应用程序?

  13. 13

    如何通过链接(而不是复制)使应用程序使用其自身文件夹之外的模块?

  14. 14

    使用NodeJS列出正在运行的应用程序

  15. 15

    NodeJS / Express应用程序的使用顺序和用法

  16. 16

    将tsUnit与NodeJs应用程序一起使用

  17. 17

    如何使用Mocha,Grunt测试NodeJS应用程序?

  18. 18

    如何使用WebStorm创建NodeJS + LoopBack应用程序?

  19. 19

    Docker使用NodeJS应用程序构建卷映射

  20. 20

    使用axios从NodeJS Express应用程序捕获错误消息

  21. 21

    如何使用nodemon运行我的nodejs应用程序?

  22. 22

    使用CoffeeScript和HAML生成NodeJS Express应用程序

  23. 23

    使用某些设置启动nodejs应用程序?

  24. 24

    使用MEANIO的NodeJs应用程序的标准结构是什么

  25. 25

    如何使用 reactjs 生成 nodejs express 应用程序

  26. 26

    如何使用 nodejs 部署 Angular 应用程序

  27. 27

    未使用PropertyBinding使用应用程序设置更新ToolStripLabel

  28. 28

    如何使用背景幕作为主应用程序菜单更新 Flutter 应用程序的布局

  29. 29

    如何更新应用程序?

热门标签

归档