Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript “什么是”呢/bin/www";你喜欢Express 4.x吗?_Javascript_Node.js_Heroku_Express - Fatal编程技术网

Javascript “什么是”呢/bin/www";你喜欢Express 4.x吗?

Javascript “什么是”呢/bin/www";你喜欢Express 4.x吗?,javascript,node.js,heroku,express,Javascript,Node.js,Heroku,Express,我刚开始在Node.js应用程序中学习Express 4.0,我发现它生成了/bin/www文件,其中仅写入应用程序服务器和端口设置,其他所有内容(如中间件和路由)都在/app.js文件中定义 但是,我不确定这个/bin/www有什么作用。我使用过Express 3.x,我总是在相同的/app.js文件上定义服务器和端口设置以及路由和中间件,并使用node app.js启动我的节点应用程序。那么使用/bin/www有什么意义呢?它是否只将服务器和端口定义与其他定义分开 现在,当我使用expres

我刚开始在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"
}
但是,我想知道是应该使用
节点/bin/www
还是
npm start
启动我的应用程序。我应该运行哪个命令来启动我的应用程序


另外,当我将我的应用程序部署到heroku时,我应该在
Procfile
文件中写什么?
web:node app.js
够了吗?

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

package.json

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

它表示启动命令行。这很重要,因为它可能包含完整的命令行,而不仅仅是启动程序文件的路径。

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

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

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

npm start
要将Express 4.x应用程序部署到Heroku,请将其添加到您的
程序文件中:

web: npm start
或者,如果您可以在
package.json
中使用start脚本,heroku将自动使用该脚本,请阅读更多


将其放入Procfile
web:node./bin/www
并检查它是否与工头启动一起工作。
如果您使用的是express generator,请查看您的本地文件,
/bin
,其中有
www
文件。因此,当您运行
node./bin/www
时,node.js将在
www
文件中执行代码。没什么特别的。

在Windows上,使用以下命令:

设置调试=myapp:*&npm启动 然后加载浏览器以访问应用程序


以上这些都回答得很好。 但如果您想使用
node app.js
,请只使用Express 3.*版本。您可以按照以下步骤操作:

由于Express4生成器生成的app.js文件现在是Node.js模块,因此无法作为应用程序单独启动(除非修改代码)。模块必须加载到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')}`);
})
接下来,在package.json文件中更改
“start”:“node./bin/www”

此后,您现在已将/bin/www的功能移回app.js。现在,开始使用
“start”:“node app.js”
运行您的express应用程序

谢谢。通过你对最后两段的出色解释,我终于明白了使用
www
的意义。我不知道为什么会这样命名——也许是以万维网的名字命名?@NicolasS.Xu在ExpressJS的Github repo上,向下滚动到快速入门section@Ved为什么是“垃圾桶”?我把它和二进制可执行文件联系起来。@regularmike我猜,它也可能意味着“可执行”脚本(就像在linux环境中一样)@Ved是的,似乎很久以前它就演变成了任何可执行文件。在Python、Perl和unix/linux中通用。您能帮我回答这个问题吗?非常感谢。为什么叫垃圾桶?它不包含二进制文件。欢迎来到SO!我认为这并不能真正回答眼前的问题。请重新阅读该问题,以完全理解原始海报所提出的所有问题。如果您要部署到Azure应用程序服务,则必须创建web.config并将所有index.js替换为bin/www,类似于该文档,请参见
app.set('port', process.env.PORT || 3000)

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