Express Generator - TypeError: app.set不是一个函数
Express Generator - TypeError: app.set is not a function
我首先自己用Node/Express创建了一个API,从一种'幼稚'的方式学习到大多数程序员的方式。它工作得很好,我决定试试express-generator。
设置好后,应用程序运行正常。
我添加了我的一堆代码(主要是在app.js和导入一些路由尝试),我没有改变任何在bin/www的express设置。
但是在启动时我得到了这个错误指向bin/www:
app.set('port', port);
^
TypeError: app.set is not a function
我不知道为什么这部分自动生成的代码现在不想工作了。
这里是2个主体文件
bin/www:(generated- unchanged)
#!/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})
导出包含express()的应用程序。所以我在这里漏掉了一些东西,但是我不知道是什么
这个问题是由这个设置引起的:
cluster(function(worker) {
var app = express();
...
module.exports = app;
}, { ... });
因为cluster
将异步调用"worker函数",所以导出也是异步完成的,这对于bin/www
来说太晚了。除此之外,worker函数将在一个单独的进程中运行,这也使事情变得复杂。
因为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
或者为你的应用创建一个配置文件。
还有一个名为dotenv
的包,它将允许你的Node应用程序直接从文件中读取环境变量
相关文章:
- 创建一个类似链接的按钮,并通过Javascript函数打开一个新的弹出窗口
- 我可以在json对象中添加一个函数吗
- Javascript使函数一个接一个地执行
- 是JavaScript中的函数一个对象
- 两个几乎相等的jQuery函数;一个适用于IE,一个不适用于IE
- 两个Javascript函数一个window.onload=Custom.init;和一个window.onload=f
- 使javascript加载函数一个接一个地执行
- 如何通过两个嵌套的匿名函数(一个带有超时的事件处理程序)传递变量
- 为什么我不能让两个jQuery函数一个在另一个里面呢?
- 给函数一个变量名,而不是它的值
- 如何使用嵌入函数(一个滚动页由Pete - peachananr)
- 是否有可能给JavaScript函数一个类型/类?
- 确保两个函数一个接一个地执行,其中第一个函数内部有一个异步调用
- 两个不同的ajax函数一个接一个调用返回相同的值
- jQuery第一次更改函数一个工作
- 给这个函数一个id
- 如何给回调函数一个值一个变量在特定时刻
- 使用回调使两个函数一个接一个地运行
- 两个函数(一个用php)是否可以用“;onclick”;
- 两个几乎相同的函数.一个函数用Queue进行排队.Jquery效果在queued函数上不起作用.为什么