Я пишу свой первый веб-сервер node (не стесняйтесь давать мне отзывы), который использует экспресс и gith для развертывания. Проблема в том, что я получаю следующую ошибку при развертывании, и если я запускаю script через pm2, процесс, казалось бы, удаляется. Есть идеи? script приведен ниже.
sudo node server.js
Error: Requested Range Not Satisfiable
at SendStream.error (/home/gareth/node_modules/express/node_modules/send/lib/send.js:145:16)
at SendStream.send (/home/gareth/node_modules/express/node_modules/send/lib/send.js:371:19)
at /home/gareth/node_modules/express/node_modules/send/lib/send.js:323:10
at /home/gareth/node_modules/newrelic/node_modules/continuation-local-storage/node_modules/async-listener/glue.js:177:31
at Object.oncomplete (fs.js:107:15)
Completed deployment
Server.js
/*
Webserver
Should use port 80 on production
Mongo DB for database - http://docs.mongodb.org/manual/tutorial/
Use pm2 to ensure it runs forever and load balanced
NPM
https://www.npmjs.org/package/fs
https://www.npmjs.org/package/express
https://www.npmjs.org/package/body-parser
https://www.npmjs.org/package/gith
https://www.npmjs.org/package/nodemailer
*/
// server monitoring
require('newrelic');
var APP = {
// include some scripts
express: require('express'),
fs: require('fs'),
mdb: require('mongodb'),
nodemailer: require('nodemailer'),
gith: require('gith').create(9001),
execFile: require('child_process').execFile,
// setup
port: 80,
dbUrl: 'mongodb://127.0.0.1:27017/test',
gitRepo: '*****',
gmailUser: '*****',
gmailPass: '******',
email: '*****',
subject: 'Website enquiry',
linuxUser: '*****',
wwwPath: '/var/www/',
// vars
server: null,
app: null,
options: {},
smtpTransport: null,
db: null,
init: function (){
// setup express
APP.app = APP.express().use(require('body-parser')());
// create the server
APP.fs.exists('./ssl/privatekey.pem', function (e){
if(e){
APP.fs.exists('./ssl/certificate.pem', function (e){
if(e){
APP.options = {
key: APP.fs.readFileSync('./ssl/privatekey.pem'),
cert: APP.fs.readFileSync('./ssl/certificate.pem'),
};
APP.server = require('http').createServer(APP.options, APP.app).listen(APP.port, '0.0.0.0');
} else {
APP.server = require('http').createServer(APP.app).listen(APP.port, '0.0.0.0');
}
});
} else {
APP.server = require('http').createServer(APP.app).listen(APP.port, '0.0.0.0');
}
});
// set up smtp
APP.smtpTransport = APP.nodemailer.createTransport('Gmail',{
auth: {
user: APP.gmailUser,
pass: APP.gmailPass,
}
});
// http routing
APP.routing();
// wait for github push
APP.gith({
repo: APP.gitRepo
}).on('all', function(payload){
if(payload.branch === 'master' && payload.original.commits[0].message.indexOf('#deploy') >= 0){
APP.execFile('/home/'+APP.linuxUser+'/deploy.sh', function(err, stdout, stderr) {
console.log('Completed deployment');
});
}
});
},
// open the db
openDB: function (){
APP.mdb.connect(APP.dbURL, function(err, db){
if(err)
throw err;
APP.db = db;
});
},
// close the db
closeDB: function (){
APP.db.close();
},
// insert a file to the db
create: function (col, data){
// open the db
APP.openDB();
var collection = APP.db.collection(col);
collection.insert(data, function(err, docs){
if(err){
console.warn(err.message);
} else {
console.log('Successfully inserted record');
}
});
// close the db
APP.closeDB();
},
// insert a file to the db
update: function (col, crit, data){
// open the db
APP.openDB();
// example criteria
// {key: value} // get something specific
// {key: {$lt: value}} // Less Than
// {key: {$gte: value}} // Greater than or equal to
// {key: {$ne: 'value'}} // Not Equal To
// {key: {$in: ['value', 'value', 'value']}} // Exists in array
// updateoperators
// db.col.update({key: 'value'}, {$addToSet: {key: ['value']}});
// Or we can add a new field to Cash
// db.col.update({key: 'value'}, {$set: {'age': 50} });
// You can also push and pull items from arrays:
// db.col.update({key: 'value'}, {$push: {'key': 'value'} });
// db.col.update({key: 'value'}, {$pull: {'key': 'value'} });
var collection = APP.db.collection(col);
collection.update(crit, data, function (){
if(err){
console.warn(err.message);
} else {
console.log('Successfully updated record');
}
});
// close the db
APP.closeDB();
},
// find all in the db collection that match
read: function (col, crit){
// open the db
APP.openDB();
// example criteria
// {key: value} // get something specific
// {key: {$lt: 5}} // Less Than
// {key: {$gte: 10}} // Greater than or equal to
// {key: {$ne: 'b'}} // Not Equal To
// {key: {$in: ['a', 'b', 'c']}} // Exists in array
var collection = APP.db.collection(col);
collection.find(crit).toArray(function(err, results) {
if(err){
console.warn(err.message);
} else {
console.log(results);
}
});
// close the db
APP.closeDB();
},
// find and delete from collection
delete: function (col, crit){
// open the db
APP.openDB();
// example criteria
// {key: value} // get something specific
// {key: {$lt: 5}} // Less Than
// {key: {$gte: 10}} // Greater than or equal to
// {key: {$ne: 'b'}} // Not Equal To
// {key: {$in: ['a', 'b', 'c']}} // Exists in array
var collection = APP.db.collection(col);
collection.remove(crit);
// close the db
APP.closeDB();
},
// routing files
routing: function (){
// hide the engine creating the server
APP.app.disable('x-powered-by');
// index page
APP.app.get('/*', function (req, res, next){
APP.renderPage(req, res, next);
});
// handle post data
APP.app.post('/', function(req, res, next) {
APP.sendEmail(req);
APP.renderPage(req, res, next);
});
APP.app.post('/index.html', function(req, res, next) {
APP.sendEmail(req);
APP.renderPage(req, res, next);
});
},
// render page
renderPage: function (req, res, next){
// get the host and point to correct folder
var host = req.get('host');
if(host.indexOf('www.') >= 0){
host = host.replace('www.', '');
}
// see if we are on staging
if(host.indexOf('staging.') >= 0){
// tidy url
host = host.replace('staging.', '');
var url = APP.wwwPath + host + '/app';
APP.fs.exists(url + req.url, function (e){
if(e){
res.sendfile(url + req.url);
} else {
res.sendfile(url + '/404.html');
}
});
} else {
var url = APP.wwwPath + host + '/dist';
APP.fs.exists(url + req.url, function (e){
if(e){
res.sendfile(url + req.url);
} else {
res.sendfile(url + '/404.html');
}
});
}
},
// sanitize post
sendEmail: function (req){
var name = req.body.name,
email = req.body.email,
msg = req.body.msg,
nameRegex = /^([ \u00c0-\u01ffa-zA-Z'\-])+$/,
emailRegex = /^(([^<>()[\]\\.,;:\[email protected]\']+(\.[^<>()[\]\\.,;:\[email protected]\']+)*)|(\'.+\'))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
if(emailRegex.test(email) && nameRegex.test(name) && msg.length > 10){
// setup e-mail data with unicode symbols
var mailOptions = {
from: name + ' <' + email + '>',
to: APP.email,
subject: APP.subject,
text: msg,
html: '<p>'+ msg +'</p>'
}
// send mail with defined transport object
APP.smtpTransport.sendMail(mailOptions, function(error, response){
if(error){
console.log(error);
}else{
console.log('Message sent: ' + response.message);
}
// shut down the connection pool - no more messages
//smtpTransport.close();
});
}
}
};
// run the script
APP.init();