"./bin/www"在Express 4.x中做了什么?

Bla*_*ard 146 javascript heroku node.js express

我刚开始在我的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"
}
Run Code Online (Sandbox Code Playgroud)

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

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

And*_*ndy 121

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());
Run Code Online (Sandbox Code Playgroud)

但是,在Express 4.0中,所有中间件都已被删除,因此可以独立于核心Express(静态中间件除外)进行维护和更新,因此需要单独调用它们(您看到的内容app.js).

bin/目录充当您可以定义各种启动脚本的位置,它www是一个应该是什么样子的示例.最终,你可以有启动脚本一样test,stop或者restart等具有这种结构可以让你有不同的配置,而不触及app.js.

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

npm start
Run Code Online (Sandbox Code Playgroud)

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

web: npm start
Run Code Online (Sandbox Code Playgroud)

  • 谢谢.通过对最后两段的精彩解释,我终于明白了使用`www`的重点.我不知道为什么它这样命名 - 可能以万维网命名? (6认同)
  • @Ved为什么"bin",但是?我将它与二进制可执行文件联系起来 (4认同)
  • @regularmike我猜,它也可能意味着'可执行'脚本(就像在linux的环境中一样) (2认同)
  • @Ved是的,好像很久以前它演变成任何可执行的东西.常见于Python,Perl和unix/linux. (2认同)

4dg*_*rav 10

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

package.json 具有

   "scripts": {
     "start": "node ./bin/www"
   }
Run Code Online (Sandbox Code Playgroud)

其中说明了启动命令行.这非常重要,因为它可能包含完整的命令行,而不仅仅是启动文件的路径.

  • 为什么叫bin?它不包含二进制文件... (4认同)

Kap*_*shi 6

以上都回答的很好。但如果您只想使用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')}`);
})
Run Code Online (Sandbox Code Playgroud)

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