嗨,您好,
我正在尝试向我的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功能正常工作。
欢迎任何帮助。提前致谢!
所以我终于解决了这个问题。如果有人对我的操作方式感兴趣,可以这样做:
我使用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;
};
如果版本不是最新版本,则使用node-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] 删除。
我来说两句