Javascript 快速生成器-类型错误:app.set不是函数
我首先用Node/Express自己创建了一个API,以从一种“幼稚”的方式学习大多数程序员的做法。它工作得很好,我决定试试express generator 设置完所有内容后,应用程序运行良好 我添加了一堆代码(主要是在app.js中,并导入了一些路由进行尝试),但在设置express的bin/www中没有任何更改 但在发布时,我发现这个错误指向了这个特别的文件bin/www:Javascript 快速生成器-类型错误:app.set不是函数,javascript,node.js,express,express-generator,Javascript,Node.js,Express,Express Generator,我首先用Node/Express自己创建了一个API,以从一种“幼稚”的方式学习大多数程序员的做法。它工作得很好,我决定试试express generator 设置完所有内容后,应用程序运行良好 我添加了一堆代码(主要是在app.js中,并导入了一些路由进行尝试),但在设置express的bin/www中没有任何更改 但在发布时,我发现这个错误指向了这个特别的文件bin/www: app.set('port', port); ^ TypeError: app.set is not a
app.set('port', port);
^
TypeError: app.set is not a function
我不知道为什么自动生成的这部分代码现在不起作用
这里是2个主体文件
bin/www:(生成时未触及)
app.js:
//模块依赖项
const express=require('express');
const cluster=require('express-cluster');//在不同的线程上分叉服务
常量头盔=需要(“头盔”);//安全HTTP头
const cors=需要(“cors”);
const path=require('path');
const bodyParser=require('body-parser');//帮助轻松解析req/res的主体
const port=process.env.port | 3000;
const mongoose=require('mongoose');//管理MongoDB请求
集群(功能(工作者){
var-app=express();
//MongoDB配置
const config=require('./misc/config/index');//类似MongoDB凭证的配置变量
mongoose.Promise=global.Promise;
mongoose.connect(config.getDBConnectionString());//配置到cnx到mongodb
//connect(config.getDBConnectionString(),{config:{autoIndex:false}});
//中间件
use(bodyParser.json());
use(bodyParser.urlencoded({extended:true}));
app.use(helmet.frameguard());//默认值-通过在头中放置一些设置来帮助保护请求
app.use(cors());//处理跨源资源共享
//日志文件
const log=require('./misc/log/log');
应用程序使用(日志);
//配置着陆页面至/
app.use('/assets',express.static(path.join('public'));
应用程序集(“查看引擎”、“ejs”);
//入口点
const entryPoint=require(“./routes/entryPoint”);
app.get('/',entryPoint.index);
app.get('/api',函数(req,res){
res.redirect(301,“/”);
})
//API密钥处理程序
const auth=require('./misc/auth/auth');
应用程序使用(认证);
//名单
const list=require('./routes/list/listRouter');//获取列表端点
//应用程序使用('/api/list',list);
//地图
const map=require('./routes/map/mapRouter');//获取列表端点
//应用程序使用('/api/map',map);
module.exports=app;
},{计数: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之间提供负载平衡。对此,一个流行的解决方案是,尽管它并不适用于所有人(似乎有点碰运气)
如果需要传递环境变量,可以从命令行执行此操作:
$ env API_KEY=XXX pm2 start app.js
或者为你的应用程序创建
还有一个名为的包,它允许您的节点应用程序直接从文件中读取环境变量。此问题是由此设置引起的:
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之间提供负载平衡。对此,一个流行的解决方案是,尽管它并不适用于所有人(似乎有点碰运气)
如果需要传递环境变量,可以从命令行执行此操作:
$ env API_KEY=XXX pm2 start app.js
或者为你的应用程序创建
还有一个名为的包,允许您的节点应用程序直接从文件中读取环境变量。
cluster()
将是异步的,因此在导入时还没有导出任何内容。如果你需要在多个CPU上运行你的应用程序,也许值得一看。谢谢你的pm2,但我听说pm2消耗了很多资源?pm2可能有点偶然,有些人有很多问题,大多数人(包括我自己)没有。你可以从等式中删除/bin/www
,它没有提供太多的功能,因此你可以将它移动到app.js
(并继续使用cluster()
)。现在这对我来说没什么大不了的。但是我找不到pm2如何启动.env文件,例如,要获取API_KEY=xxxxxxxxx,可以在pm2
命令行上设置环境变量:env API_KEY=XXX pm2…
。或者在你的应用程序中使用类似的方法来读取包含env vars的文件。cluster()
将是异步的,因此在导入时还没有导出任何内容。如果你需要在多个CPU上运行你的应用程序,也许值得一看。