2016-08-22 212 views
0

我首先创建了一个API,使用Node/Express来从大多数程序员所做的“天真”方式中学习。这是运作良好,我决定尝试快递发电机。快速生成器 - 类型错误:app.set不是函数

设置完毕后,应用程序正常工作。

我添加了我的一堆代码(主要是在app.js和导入几条路线来尝试),我没有改变任何设置快递的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

是的,我只是尝试删除群集(),它的工作原理。谢谢pm2,但我听说pm2正在消耗很多资源? – Ragnar

+0

pm2可能有点儿碰巧,有些人有很多问题,大多数人(包括我自己)都没有。你总是可以从等式中移除'./ bin/www',它不提供_that_多功能,所以你可以把它移动到'app.js'(并继续使用'cluster()')。 – robertklep

回答

2

的问题是由这种设置造成的:

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

因为cluster将调用“工人功能”异步,出口是异步完成的为好,这是为时已晚bin/www。除此之外,工作人员功能将运行在一个单独的过程中,这也使事情变得复杂。

由于bin/www在做什么方面相对简单,您可以选择将其内容(或至少它的作用要点)移动到app.js,然后以node app.js开始您的应用。你甚至可以用一个简单的脚本替换bin/www

#!/usr/bin/env node 

require('../app'); 

或者,您也可以留下您的代码按并依靠外部程序来提供负载在可用CPU的平衡。一个流行的解决方案是pm2,虽然它不适合每个人(看起来似乎是碰碰运气)。

如果你需要传递环境变量,你可以在命令行中这样做:

$ env API_KEY=XXX pm2 start app.js 

或者创建a configuration file为您的应用程序。

还有一个名为dotenv的软件包,可让您的Node应用程序直接从文件读取环境变量。