【问题标题】:Express server: Error: Requested Range Not SatisfiableExpress 服务器:错误:请求的范围不满足
【发布时间】:2014-06-03 23:35:07
【问题描述】:

我正在编写我的第一个节点 Web 服务器(请随时给我反馈),它使用 express 和 gith 进行部署。问题是我在部署后收到以下错误,如果我通过 pm2 运行脚本,该过程似乎会被删除。有任何想法吗?脚本附在下面。

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

服务器.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 = /^(([^<>()[\]\\.,;:\s@\']+(\.[^<>()[\]\\.,;:\s@\']+)*)|(\'.+\'))@((\[[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();

【问题讨论】:

  • 我不确定发生了什么,但是当我将两个服务器实例或函数从同一个文件中分离出来时,它会起作用。我现在有两个文件/服务器实例在服务器上的不同端口上工作
  • 我有一个简单的 Express 应用程序因此错误而崩溃。
  • 你能把源码发布到github或者其他地方吗?我想复制完整的源代码。

标签: javascript node.js deployment express


【解决方案1】:

你不应该使用require('https')吗? 还要调查express.static...

【讨论】:

    【解决方案2】:

    看起来错误来自您的 deploy.sh 脚本。

    要解决此问题,请确保传出请求没有 Content-Range。

    也可能有助于发布 deploy.sh

    【讨论】:

      【解决方案3】:

      尝试将 acceptRanges: false 作为参数传递给 res.sendFile 方法。

      所以不要打电话给res.sendFile(filePath) 使用res.sendFile(filePath, {acceptRanges: false})

      【讨论】:

        猜你喜欢
        • 2011-08-18
        • 2017-07-26
        • 1970-01-01
        • 2017-07-28
        • 1970-01-01
        • 2020-09-24
        • 2019-12-23
        • 2019-07-06
        • 2019-04-26
        相关资源
        最近更新 更多