【问题标题】:What does "./bin/www" do in Express 4.x?“./bin/www”在 Express 4.x 中有什么作用?
【发布时间】:2014-06-03 21:31:47
【问题描述】:

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

【问题讨论】:

  • 需要注意的是/bin/wwwexpress-generator工具特有的。来自express docs:“bin 目录和无扩展名的www 文件对于创建 Express 应用程序或启动应用程序都是必需的。”

标签: javascript node.js heroku express


【解决方案1】:

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

package.json

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

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

【讨论】:

  • 你能帮我回答这个问题吗?谢谢!
  • 为什么叫bin?它不包含二进制文件。 . .
  • 对于像 Kinnard 这样想知道的人来说,这可能与“bin”的一般用途有关@
【解决方案2】:

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 服务器启动的示例。

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

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

npm start

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

web: npm start

或者如果你可以在你的package.json 中使用启动脚本,heroku 会自动使用它,阅读更多here

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

【讨论】:

  • 谢谢。通过您对最后两段的出色解释,我终于明白了使用www 的意义何在。我不知道为什么它会这样命名——也许是以万维网命名的?
  • @NicolasS.Xu 在 ExpressJS 的 Github repo github.com/visionmedia/express,向下滚动到快速入门部分
  • @Ved 为什么是“bin”?我将其与二进制可执行文件相关联。
  • @regularmike 我猜,它也可能意味着“可执行”脚本(就像在 linux 的环境中一样)
  • @Ved 是的,似乎很久以前它演变为任何可执行文件。在 Python、Perl 和一般的 unix/linux 中很常见。
【解决方案3】:

把这个放到 Procfile web: node ./bin/www 并检查它是否适用于foreman start。 该应用程序应该在端口 5000 上可用

【讨论】:

    【解决方案4】:

    如果您使用的是 express-generator,只需查看您的本地文件 ./bin,在 ./bin 中有 www 文件。所以当你运行node ./bin/www时,node.js会执行www文件中的代码。没什么特别的。

    【讨论】:

    【解决方案5】:

    在 Windows 上,使用以下命令:

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

    【讨论】:

    • 欢迎来到 SO!我认为这并不能真正回答手头的问题。请重新阅读问题以完全理解原始海报所要求的所有内容。
    【解决方案6】:

    以上都回答得很好。 但如果您只想像 Express 3.* 版本那样使用node app.js。您可以关注以下:

    由于 Express 4 生成器生成的 app.js 文件现在是 Node.js 模块,它不再可以作为应用程序独立启动(除非您修改代码)。该模块必须加载到 Node.js 文件中并通过 Node.js 文件启动。在这种情况下,Node.js 文件是 ./bin/www。欲了解更多信息,请访问the official documentation

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

    要摆脱 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')}`);
    })
    

    接下来,更改 package.json 文件中的 "start": "node ./bin/www"。 因为,您现在已将 ./bin/www 的功能移回 app.js。现在,开始使用"start": "node app.js" 运行您的快速应用程序。

    【讨论】:

      【解决方案7】:

      来自express docs

      [...] 启动应用程序的实际命令是 node ./bin/www [在 Express 4 中],过去是 node app.js 在 Express 3 中。 因为由 Express 4 生成器生成的 app.js 文件现在是一个 Node.js 模块,它不能再作为应用程序独立启动(除非您修改代码)。该模块必须加载到 Node.js 文件中并通过 Node.js 文件启动。在本例中,Node.js 文件为 ./bin/www

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-01
        • 2014-08-27
        • 2015-02-25
        • 1970-01-01
        • 2016-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多