如何将静态公用文件夹添加到节点服务器?

时间:2015-05-13 10:11:14

标签: node.js openshift

我用他们的向导创建了一个新的OpenShift节点应用程序,它在应用程序的根目录中创建了一个索引文件。我想将所有内容放在公用文件夹中,然后将此文件夹设置为静态文件夹。

我是Node的新手,无法找到解决方案,在我提交代码时不会破坏我的OpenShift服务器。我认为这在节点中非常简单。

更新:

节点使用Express,所以我读过我可以使用此代码设置静态文件夹:

app.use(express.static(__dirname + '/public'));

但是添加它会破坏我的服务器(再次)。我在OpenShift上运行它时得到503。

这是我的server.js代码:

#!/bin/env node
//  OpenShift sample Node application
var fs      = require('fs');
var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');

var routes = require('./routes/index');
var users = require('./routes/users');


/**
 *  Define the sample application.
 */
var SampleApp = function() {

//  Scope.
var self = this;

/*  ================================================================  */
/*  Helper functions.                                                 */
/*  ================================================================  */

/**
 *  Set up server IP address and port # using env variables/defaults.
 */
self.setupVariables = function() {
    //  Set the environment variables we need.
    self.ipaddress = process.env.OPENSHIFT_NODEJS_IP;
    self.port      = process.env.OPENSHIFT_NODEJS_PORT || 8080;

    if (typeof self.ipaddress === "undefined") {
        //  Log errors on OpenShift but continue w/ 127.0.0.1 - this
        //  allows us to run/test the app locally.
        console.warn('No OPENSHIFT_NODEJS_IP var, using 127.0.0.1');
        self.ipaddress = "127.0.0.1";
    };
};


/**
 *  Populate the cache.
 */
self.populateCache = function() {
    if (typeof self.zcache === "undefined") {
        self.zcache = { 'index.html': '' };
    }

    //  Local cache for static content.
    self.zcache['index.html'] = fs.readFileSync('./index.html');
};


/**
 *  Retrieve entry (content) from cache.
 *  @param {string} key  Key identifying content to retrieve from cache.
 */
self.cache_get = function(key) { return self.zcache[key]; };


/**
 *  terminator === the termination handler
 *  Terminate server on receipt of the specified signal.
 *  @param {string} sig  Signal to terminate on.
 */
self.terminator = function(sig){
    if (typeof sig === "string") {
       console.log('%s: Received %s - terminating sample app ...',
                   Date(Date.now()), sig);
       process.exit(1);
    }
    console.log('%s: Node server stopped.', Date(Date.now()) );
};


/**
 *  Setup termination handlers (for exit and a list of signals).
 */
self.setupTerminationHandlers = function(){
    //  Process on exit and signals.
    process.on('exit', function() { self.terminator(); });

    // Removed 'SIGPIPE' from the list - bugz 852598.
    ['SIGHUP', 'SIGINT', 'SIGQUIT', 'SIGILL', 'SIGTRAP', 'SIGABRT',
     'SIGBUS', 'SIGFPE', 'SIGUSR1', 'SIGSEGV', 'SIGUSR2', 'SIGTERM'
    ].forEach(function(element, index, array) {
        process.on(element, function() { self.terminator(element); });
    });
};


/*  ================================================================  */
/*  App server functions (main app logic here).                       */
/*  ================================================================  */

/**
 *  Create the routing table entries + handlers for the application.
 */
self.createRoutes = function() {
    self.routes = { };

    self.routes['/asciimo'] = function(req, res) {
        var link = "http://i.imgur.com/kmbjB.png";
        res.send("<html><body><img src='" + link + "'></body></html>");
    };

    self.routes['/'] = function(req, res) {
        res.setHeader('Content-Type', 'text/html');
        res.send(self.cache_get('index.html') );
    };
};


/**
 *  Initialize the server (express) and create the routes and register
 *  the handlers.
 */
self.initializeServer = function() {

    self.createRoutes();
    self.app = express.createServer();

    // view engine setup
    self.app.set('views', path.join(__dirname, 'views'));
    self.app.set('view engine', 'jade');

    // uncomment after placing your favicon in /public
    //app.use(favicon(__dirname + '/public/favicon.ico'));
    self.app.use(logger('dev'));
    self.app.use(bodyParser.json());
    self.app.use(bodyParser.urlencoded({ extended: false }));
    self.app.use(cookieParser());
    self.app.use(express.static(path.join(__dirname, 'public')));

    self.app.use('/', routes);
    self.app.use('/users', users);

    // catch 404 and forward to error handler
    self.app.use(function(req, res, next) {
      var err = new Error('Not Found');
      err.status = 404;
      next(err);
    });

    // error handlers

    // development error handler
    // will print stacktrace
    if (self.app.get('env') === 'development') {
      self.app.use(function(err, req, res, next) {
        res.status(err.status || 500);
        res.render('error', {
          message: err.message,
          error: err
        });
      });
    }

    // production error handler
    // no stacktraces leaked to user
    self.app.use(function(err, req, res, next) {
      res.status(err.status || 500);
      res.render('error', {
        message: err.message,
        error: {}
      });
    });

    module.exports = app;

    //  Add handlers for the app (from the routes).
    for (var r in self.routes) {
        self.app.get(r, self.routes[r]);
    }
};


/**
 *  Initializes the sample application.
 */
self.initialize = function() {
    self.setupVariables();
    self.populateCache();
    self.setupTerminationHandlers();

    // Create the express server and routes.
    self.initializeServer();
};


/**
 *  Start the server (starts up the sample application).
 */
self.start = function() {
    //  Start the app on the specific interface (and port).
    self.app.listen(self.port, self.ipaddress, function() {
        console.log('%s: Node server started on %s:%d ...',
                    Date(Date.now() ), self.ipaddress, self.port);
    });
};

};   /*  Sample Application.  */



/**
 *  main():  Main code.
 */
var zapp = new SampleApp();
zapp.initialize();
zapp.start();

2 个答案:

答案 0 :(得分:2)

我以为我会为那些不了解Node的人解答这个问题:

我使用OpenShift在您创建新节点应用程序时提供的标准样板代码来使用它。要将所有内容移动到公用文件夹并从中提供文件,您只需要在server.js中编辑以下代码:

self.populateCache = function() {
    if (typeof self.zcache === "undefined") {
        self.zcache = { 'index.html': '' };
    }

    //  Local cache for static content.
    self.zcache['index.html'] = fs.readFileSync('./public/index.html'); // < ---- THIS WAS EDITED TO INCLUDE /public
};

然后稍后:

self.initializeServer = function() {
    self.createRoutes();
    self.app = express.createServer();
    self.app.use(express.static(__dirname + '/public')); // < ---- THIS WAS ADDED

    //  Add handlers for the app (from the routes).
    for (var r in self.routes) {
        self.app.get(r, self.routes[r]);
    }
};

希望以后可以帮助别人。

: - )

答案 1 :(得分:0)

您可以使用Exprees和Path模块来包含静态文件,例如:

&#13;
&#13;
app.use(express.static(path.join(__dirname, 'public')));
&#13;
&#13;
&#13;