Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/478.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 快速生成器-类型错误:app.set不是函数_Javascript_Node.js_Express_Express Generator - Fatal编程技术网

Javascript 快速生成器-类型错误:app.set不是函数

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

我首先用Node/Express自己创建了一个API,以从一种“幼稚”的方式学习大多数程序员的做法。它工作得很好,我决定试试express generator

设置完所有内容后,应用程序运行良好

我添加了一堆代码(主要是在app.js中,并导入了一些路由进行尝试),但在设置express的bin/www中没有任何更改

但在发布时,我发现这个错误指向了这个特别的文件bin/www:

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上运行你的应用程序,也许值得一看。