Express Generator - TypeError: app.set不是一个函数

Express Generator - TypeError: app.set is not a function

本文关键字:函数 一个 Generator TypeError set app Express      更新时间:2023-09-26

我首先自己用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应用程序直接从文件中读取环境变量