Express 4.x中的“ ./bin/www”有什么作用?


157

我刚开始在Node.js应用程序中学习Express 4.0,我发现它生成了./bin/www文件,在该文件上只写了应用程序服务器和端口设置,其他文件(如中间件和路由)都在./app.js文件中定义。

但是,我不确定这./bin/www是做什么的。我使用Express 3.x,并且始终在同一./app.js文件中定义服务器和端口设置以及路由和中间件,并使用来启动我的节点应用程序node app.js。那么使用的意义./bin/www何在?它仅将服务器和端口定义与其他定义分开吗?

现在,当我使用express-generator创建包时,其中package.json包含以下定义:

"scripts": {
    "start": "node ./bin/www"
}

但是,我想知道是否应该使用node ./bin/www或启动我的应用程序npm start。我应该运行哪个命令来启动我的应用程序?

而且,当我将应用程序部署到heroku时,应该在Procfile文件中写些什么?是否web: node app.js足够?


Answers:


131

Express 3.0中,通常会使用app.configure()(或app.use())设置所需的所需中间件。您指定的那些中间件与Express 3.0捆绑在一起。

例:

var express = require('express');
var routes = require('./routes');
var user = require('./routes/user');
var http = require('http');
var path = require('path');

var app = express();

// all environments
app.set('port', process.env.PORT || 3000);
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.compress());
app.use(express.json());
app.use(express.urlencoded());
app.use(express.methodOverride());

但是,在Express 4.0中,所有中间件均已删除,因此它们可以独立于核心Express进行维护和更新(静态中间件除外),因此需要分别调用它们(如您所见app.js)。

bin/目录是您可以定义各种启动脚本的位置。这www是将Express App作为Web服务器启动的示例。

最终,您可能具有不同的脚本,如teststoprestart,等等。拥有此结构可以使您拥有不同的启动配置,而无需将所有内容塞入app.js

启动Express应用程序的正确方法是:

npm start

要将Express 4.x应用程序部署到Heroku,请将其添加到您的Procfile

web: npm start

或者,如果您仅可以在中使用启动脚本package.json,heroku将自动使用该启动脚本,请在此处阅读更多内容

"scripts": {
    "start": "node ./bin/www",
}

6
谢谢。通过对最后两段的出色解释,我终于明白了使用的意义www。我不确定为什么要这样命名-也许是以万维网命名的?
Blaszard 2014年

1
@ NicolasS.Xu在ExpressJS的Github存储库github.com/visionmedia/express上,向下滚动到“快速入门”部分
Andy

4
@Ved为什么是“ bin”?我将其与二进制可执行文件关联。
常规

2
@regularmike我猜,这也可能意味着“可执行”脚本(例如在Linux环境中)
Andy

2
@Ved是的,似乎很久以前它演变为意味着任何可执行文件。通常在Python,Perl和Unix / Linux中常见。
Regularmike 2014年

10

像Express 3.x这样的节点应用程序使用非标准的启动文件app.js,但运行的文件错误。

package.json

   "scripts": {
     "start": "node ./bin/www"
   }

指出启动命令行。这很简单,因为它可能包含完整的命令行,而不仅仅是启动文件的路径。


您能帮我回答这个问题吗?谢谢!
Nicolas S.Xu 2014年

7
为什么叫垃圾桶?它不包含二进制文件。。。
Kinnard Hockenhull


1

在Windows上,使用以下命令:

设置DEBUG = myapp:*&npm start然后在浏览器中加载http:// localhost:3000 /以访问该应用。


4
欢迎来到SO!我认为这并不能真正解决当前的问题。请重新阅读问题以完全理解原始海报的要求。
杰克

0

以上所有答案都很好。但是如果您只想使用node app.jsExpress 3. *版本。您可以按照以下步骤操作:

由于Express 4生成器生成的app.js文件现在是Node.js模块,因此无法再作为应用程序独立启动(除非您修改代码)。该模块必须加载到Node.js文件中,并通过Node.js文件启动。在这种情况下,Node.js文件为./bin/www。有关更多信息,请访问官方文档

创建Express应用程序或启动该应用程序时,bin目录和无扩展名的www文件都不是必需的。它们只是生成器提出的建议,因此可以随时对其进行修改以满足您的需求。

要摆脱www目录并使东西保持“ Express 3方式”,请删除标有module.exports = app;的行。在app.js文件的末尾,然后将以下代码粘贴到其位置:

app.set('port', process.env.PORT || 3000)

app.listen(app.get('port'), () => {
  console.log(`Express server listening on port ${app.get('port')}`);
})

其次,改变"start": "node ./bin/www"的package.json文件。从那以后,您现在已经将./bin/www的功能回了app.js。现在,开始"start": "node app.js"用于运行Express应用程序。


-1

将此文件放入Procfile web: node ./bin/www 并检查其是否适用foreman start。该应用程序应在端口5000上可用

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.