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

IT技术 javascript node.js heroku express
2021-02-27 03:57:45

我刚开始在我的 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足够?

6个回答

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 应用程序作为 Web 服务器启动的示例。

最终,您可以拥有不同的脚本,例如teststop、 或restart等。拥有这种结构可以让您拥有不同的启动配置,而无需将所有内容都塞进app.js.

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

npm start

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

web: npm start

或者,如果你可以只使用启动脚本在你的package.json,Heroku上会自动使用,阅读更多在这里

"scripts": {
    "start": "node ./bin/www",
}
@Ved 为什么是“bin”?我将其与二进制可执行文件相关联。
2021-04-15 03:57:45
谢谢。通过您对最后两段的出色解释,我终于明白了使用www. 我不确定为什么它会这样命名 - 也许以万维网命名?
2021-04-25 03:57:45
@regularmike 我猜,它也可能意味着“可执行”脚本(就像在 linux 环境中一样)
2021-04-25 03:57:45
@Ved 是的,似乎很久以前它演变为任何可执行的东西。通常在 Python、Perl 和 unix/linux 中很常见。
2021-04-28 03:57:45
@NicolasS.Xu 在 ExpressJS 的 Github 存储库github.com/visionmedia/express 上,向下滚动到快速入门部分
2021-05-05 03:57:45

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

package.json 拥有

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

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

对于像 Kinnard 这样想知道的人来说,这可能与 'bin' 在 Unix 等操作系统中对所有“可执行”的东西的一般使用有关,并且出于 unix 将其称为 'bin' 的原因,这里是一个解释
2021-04-19 03:57:45
为什么叫斌?它不包含二进制文件。. .
2021-04-22 03:57:45
你能帮我回答这个问题吗?谢谢!
2021-05-12 03:57:45

以上都回答的很好。但如果您只想使用node app.jsExpress 3.* 版本。您可以关注以下内容:

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

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

要摆脱 www 目录并保持“Express 3 way”,请删除 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 应用程序。

如果您使用的是 express-generator,只需查看您的本地文件,./bin 中./binwww文件。因此,当您运行时node ./bin/www,node.js 将执行www文件中的代码没有什么花哨。

如果要部署到 Azure 应用服务,则必须创建 web.config 并将所有 index.js 替换为 bin/www ,类似于该文档gist.github.com/rseroter/79ad73f5e6e20b029f765ca8b34f4fad
2021-05-02 03:57:45

将其放入 Procfileweb: node ./bin/www 并检查它是否适用于foreman start. 该应用程序应该在端口 5000 上可用