2016-08-22 14 views
0

私はまず、Node/Expressを使って独自のAPIを作成し、ほとんどのプログラマのやりかたを「素朴な」方法から学びました。それはうまくいっていて、私は高速ジェネレータを試すことにしました。Express Generator - TypeError:app.setは関数ではありません

アプリをすべて設定した後、正常に動作します。

私はたくさんのコードを(主にapp.jsに入れて試してみるといくつかのルートをインポートして)追加しましたが、私はexpressが設定されているbin/wwwに何も変更していません。

しかし、起動時に、私は、特にビン/ WWWを提出これを指して、このエラーを得た:

app.set('port', port); 
    ^

TypeError: app.set is not a function 

自動的に生成されたコードのこの部分は今仕事をしたくなかった理由私にはわかりません。

ここ

2校の校長は

ビン/ WWWをファイル:(生成-手つかず)

#!/usr/bin/env node 

/** 
* Module dependencies. 
*/ 

var app = require('../app'); 
var debug = require('debug')('API:server'); 
var http = require('http'); 

/** 
* Get port from environment and store in Express. 
*/ 

var port = normalizePort(process.env.PORT || '3000'); 
app.set('port', port); 

/** 
* Create HTTP server. 
*/ 

var server = http.createServer(app); 

/** 
* Listen on provided port, on all network interfaces. 
*/ 

server.listen(port); 
server.on('error', onError); 
server.on('listening', onListening); 

/** 
* Normalize a port into a number, string, or false. 
*/ 

function normalizePort(val) { 
    var port = parseInt(val, 10); 

    if (isNaN(port)) { 
    // named pipe 
    return val; 
    } 

    if (port >= 0) { 
    // port number 
    return port; 
    } 

    return false; 
} 

/** 
* Event listener for HTTP server "error" event. 
*/ 

function onError(error) { 
    if (error.syscall !== 'listen') { 
    throw error; 
    } 

    var bind = typeof port === 'string' 
    ? 'Pipe ' + port 
    : 'Port ' + port; 

    // handle specific listen errors with friendly messages 
    switch (error.code) { 
    case 'EACCES': 
     console.error(bind + ' requires elevated privileges'); 
     process.exit(1); 
     break; 
    case 'EADDRINUSE': 
     console.error(bind + ' is already in use'); 
     process.exit(1); 
     break; 
    default: 
     throw error; 
    } 
} 

/** 
* Event listener for HTTP server "listening" event. 
*/ 

function onListening() { 
    var addr = server.address(); 
    var bind = typeof addr === 'string' 
    ? 'pipe ' + addr 
    : 'port ' + addr.port; 
    debug('Listening on ' + bind); 
} 

app.js:

// Module dependencies 
const express = require('express'); 
const cluster = require('express-cluster'); // fork the service on different thread 
const helmet = require('helmet'); // Secure HTTP header 
const cors = require('cors'); 
const path = require('path'); 
const bodyParser = require('body-parser'); // Help to easily parse the body of req/res 
const port = process.env.PORT || 3000; 
const mongoose = require('mongoose'); // Manage MongoDB request 

cluster(function(worker) { 
    var app = express(); 

    // MongoDB config 
    const config = require('./misc/config/index'); // Config variable like MongoDB credential 
    mongoose.Promise = global.Promise; 
    mongoose.connect(config.getDBConnectionString()); // Config to cnx to mongodb 
    // mongoose.connect(config.getDBConnectionString(), { config: { autoIndex: false } }); 

    // Middleware 
    app.use(bodyParser.json()); 
    app.use(bodyParser.urlencoded({extended: true})); 
    app.use(helmet.frameguard()); // Default Value - Help to secure request by putting some setting in the header 
    app.use(cors()); // Handling Cross Origin Ressource Sharing 

    // Logfile 
    const log = require('./misc/log/log'); 
    app.use(log); 

    // Config Landingpage to/
    app.use('/assets', express.static(path.join(__dirname, 'public'))); 
    app.set('view engine', 'ejs'); 

    // Entry point 
    const entryPoint = require('./routes/entryPoint'); 
    app.get('/', entryPoint.index); 
    app.get('/api', function (req, res) { 
    res.redirect(301, '/'); 
    }) 

    // API Key handler 
    const auth = require('./misc/auth/auth'); 
    app.use(auth); 

    // List 
    const list = require('./routes/list/listRouter'); // Get List endpoints 
    // app.use('/api/list', list); 

    // Map 
    const map = require('./routes/map/mapRouter'); // Get List endpoints 
    // app.use('/api/map', map); 

    module.exports = app; 
}, {count: 2}) 

私は急行()が含まれるアプリケーションをエクスポートします。だから私はここで行方不明のものがあるが、私は何も見ない。問題は、この設定によって引き起こされる

+0

'cluster()'は非同期になるため、インポート時にはまだエクスポートされていません。複数のCPUでアプリケーションを実行する必要がある場合は、['pm2'](http://pm2.keymetrics.io/)を見てみる価値があります。 – robertklep

+0

ええ、私は単にcluster()を削除しようとすると、それは動作します。 pm2に感謝しますが、pm2は多くのリソースを消費していると聞いていますか? – Ragnar

+0

pm2はヒット・ミスのビットかもしれませんが、一部の人は多くの問題を抱えています。式から './bin/www'を削除することはできますが、多くの機能を提供していないので、' app.js'に移動することができます( 'cluster()'を使い続けます)。 – robertklep

答えて

2

clusterは非同期に「ワーカー機能」を呼び出しますので

cluster(function(worker) { 
    var app = express(); 
    ... 
    module.exports = app; 
}, { ... }); 

、輸出はbin/wwwため手遅れであるだけでなく非同期に行われます。それとは別に、ワーカー関数は別のプロセスで実行されるため、事態も複雑になります。

bin/wwwは、その内容に関して比較的単純なので、コンテンツ(またはそれが行うことの要点)をapp.jsに移動し、node app.jsでアプリを起動することができます。あなたも、簡単なスクリプトでbin/wwwを置き換えることができます:そのまま、利用可能なCPUの間での負荷分散を提供するために、外部のプログラムに依存している

#!/usr/bin/env node 

require('../app'); 

また、あなたのコードを残すことができます。そのための一般的な解決策はpm2ですが、それは誰にとってもうまくいくわけではありませんが(ヒット・アンド・ミスのように思われます)、

環境変数を渡す必要がある場合は、コマンドラインから行うことができます。

$ env API_KEY=XXX pm2 start app.js 

またはアプリのa configuration fileを作成します。

dotenvというパッケージもあります。これは、ノードアプリケーションがファイルから環境変数を直接読み取ることを可能にします。

関連する問題