Express 仅适用于端口 3000

Posted

技术标签:

【中文标题】Express 仅适用于端口 3000【英文标题】:Express only works on port 3000 【发布时间】:2018-01-13 21:34:25 【问题描述】:

我的应用只能在 3000 端口上运行。

如果我将端口更改为其他任何东西,它会起作用,但是当页面加载时会出现此错误。

abc 未定义 在 eval (编译时的 eval (C:\Users\ASUS\node_modules\ejs\lib\ejs.js:549:12), :22:26) 在返回Fn (C:\Users\ASUS\node_modules\ejs\lib\ejs.js:580:17) 在 tryHandleCache (C:\Users\ASUS\node_modules\ejs\lib\ejs.js:223:34) 在 View.exports.renderFile [作为引擎] (C:\Users\ASUS\node_modules\ejs\lib\ejs.js:437:10) 在 View.render (C:\Users\ASUS\node_modules\express\lib\view.js:128:8) 在 tryRender (C:\Users\ASUS\node_modules\express\lib\application.js:640:10) 在 EventEmitter.render (C:\Users\ASUS\node_modules\express\lib\application.js:592:3) 在 ServerResponse.render (C:\Users\ASUS\node_modules\express\lib\response.js:971:7) 在 C:\Users\ASUS\Desktop\nodeweb\controllers\index.js:21:6 在 Layer.handle [as handle_request] (C:\Users\ASUS\node_modules\express\lib\router\layer.js:95:5)

abc 是我在 index.ejs 中使用的变量,在路由器中定义。

var express = require('express');
var router = express.Router();
router.get('/', function(req, res) 
    res.render('index', abc: 23)
);
module.exports = router;

我正在使用 node app 命令启动我的服务器

var app = express();

app.set('view engine', 'ejs')
app.use(express.static(__dirname + '/public'));

app.use(require('./controllers'))

app.listen(8080, function() 
  console.log('Listening on port 8080...')
)

更新

我想我找到了问题 当我使用它时它可以工作

app.use('/', function(req, res) 
    res.render('index', tit:[1,2,3,4,5]);
)

而不是

app.use(require('./controllers'))

但是为什么呢?

更新

它自己修复了,现在可以正常工作了,我不知道为什么。太烂了。

【问题讨论】:

不看controllers很难说哪里错了 @ManasJayanth 我已经用 controllers/index.js 更新了帖子 我认为这是一个 ejs 错误。与哈巴狗一起工作,但我找不到记事本++的哈巴狗/玉语法荧光笔,所以我不认为我可以使用它,是否有一个很好的模板引擎,具有类似 django 的语法? swig 看起来很棒,但没有维护。 您发布的代码没有问题。刚刚在我的系统上运行良好。 也没有发现ejs 有什么问题。 【参考方案1】:

您可以尝试对端口进行硬编码: app.set("端口", process.env.PORT || 3000);

或者这个: $ PORT=8080 节点app.js

另外,如果您不在 Windows 上,并且想使用低于 1024 的端口,请先尝试以下操作: sudo PORT=80 节点 app.js

【讨论】:

它不起作用。无论如何,这与端口有什么关系? http://prntscr.com/g51dih【参考方案2】:

如果您想将路由处理程序放在单独的文件中,那么您可以,只是无需使用app.use(...) 调用该文件。

相反,您可以这样做:

require('./controllers');

它与abc 变量无关。

【讨论】:

【参考方案3】:

这是因为,我认为控制器没有正确导入。如果你这样写,我认为它会很好用

var router = require('express').Router();
router.get('/', function(req, res) 
    res.render('index', abc: 23)
);
module.exports = router;



var app = express();
var route = require('./router')
app.set('view engine', 'ejs')
app.use(express.static(__dirname + '/public'));

app.use('/',route);

app.listen(8080, function() 
  console.log('Listening on port 8080...')
)

var route = require('./router') 中定义require('./router') 时要小心,因为它是相对的,因此完全取决于您的文件夹结构。

【讨论】:

我使用的是this 应用结构,是不是错了?错误已经消失了。我什么都没做,一切都还是一样,没有错误,这让我很困惑。 没错。但是 MVC 结构更适合于干净的架构。

以上是关于Express 仅适用于端口 3000的主要内容,如果未能解决你的问题,请参考以下文章

Express 应用程序中端口 3000 的意义

端口 3000 用于 express,端口 8081 用于响应本机,如何发出 get 请求

Express Node.js 不起作用

Vagrant 和 NGINX 仅适用于 80 以外的端口

仅适用于某些路线的角度通用渲染

Express 仅加载主页