启动Express.js使用app.js或' npm start'?

时间:2015-09-24 23:01:18

标签: node.js express npm

我最近在本地服务器上安装了Node.js,当我创建了一个' server.js'文件(使用.createServer()方法添加服务器),它加载正常。

但是在安装Express.js之后,默认文件如下:

/bin
/node_modules
/public
/routes
/views
app.js
package.json

按照一些文档后,我被指示前往终端并输入以下命令:

node app.js

没有任何反应,命令行会在不到一秒的时间内刷新到下一行,并在访问正确的IP和端口后打开浏览器,但无济于事。

以下是app.js文件中的代码:

var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');

var routes = require('./routes/index');
var users = require('./routes/users');

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', routes);
app.use('/users', users);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  var err = new Error('Not Found');
  err.status = 404;
  next(err);
});

// error handlers

// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
  app.use(function(err, req, res, next) {
    res.status(err.status || 500);
    res.render('error', {
      message: err.message,
      error: err
    });
  });
}

// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
  res.status(err.status || 500);
  res.render('error', {
        message: err.message,
        error: {}
      });
    });

module.exports = app;

我明白实际的表达'然而,当我运行命令行时,文件开头所需的模块就是魔术发生的地方:

node app.js

什么都没发生。但是,如果我调用以下行:

npm start

一切似乎都没问题。我想按原样使用文档,为什么app.js无法正常工作?

谢谢。

更新:我的问题与已经发布的另一个问题太相似了,所以我必须澄清它们是如何不同的。在另一个问题中,一个人正在质疑他们在默认的app.js'上运行Supervisor命令时收到的代码。文件。

虽然性质相似,但这个问题应该仍然存在,因为那些使用我同样的方法感到困惑的人会关注实际的app.js'通过使用节点app.js'没有完全了解Supervisor实用程序。

问候。

4 个答案:

答案 0 :(得分:14)

感谢大家的回复,因为他们真的让我了解app.js文件的实际内容以及它在哪里获得它的功能。感谢Matthew Bakaitis和Bjarni Leifsson的出色表现。

我要继续回答我自己的问题的唯一原因是因为虽然解释了app.js文件的性质,但确切地说如何从命令行复制调用'node app.js'命令复制我所关注的Node.js书没有被隐含地解决。

在使用特定短语“以前的express.js版本中的app.js”搜索谷歌之后,我发现了一篇由Jilles Soeters撰写的题为“理解Express app.js”的精彩文章:

http://jilles.me/getting-the-express-app-js/

以下是适用于我的解决方案的摘录:

  

我所覆盖的文件是app.js,是您的主要配置文件   快递应用。当我第一次打开app.js时,它让我很困惑。我会保存   你做研究的麻烦,只是在这里掩盖它们。

     

在您执行任何操作之前,请将以下内容添加到您的app.js

app.listen(3000);
  

您需要这样才能在实际中打开您的应用   浏览器。启动应用后,转到 127.0.0.1:3000 (使用   节点app.js)

执行此操作后,我能够运行命令

node app.js

我能够从Express安装的根目录运行此命令,继续使用我的Node.js书籍,没有其他问题。

答案 1 :(得分:8)

这是一个常见的问题,当教程没有清楚地解释在生成应用程序时表达式正在做什么。您正在尝试学习新技术,但该教程正在积极地反对您。 :(

答案:

使用生成器时,package.json已配置为npm start call ./bin/www

文件包含app.js,在包含后,调用app.listen

app.js 没有调用app.listen这就是为什么如果你直接调用它,它会退出而没有代码或信息。你必须打电话给./bin/www,否则你必须修改app.js ...然后就会失去你使用发电机的一些原因。

网站上的related question在尝试使用supervisor来保持应用运行但仍然获得exit 0结果时发现了类似的问题。

答案 2 :(得分:2)

我是如何理解这一点的,我刚开始使用节点。

有一个带有www的bin文件夹。所有的魔力都发生了。因此,当您执行节点app.js时,它会被执行,但所有内容的逻辑都在bin / www

所以如果你看一下package.json,你会看到这个init:

“scripts”:{     “开始”:“node ./bin/www” },

因此,您可以看到执行使用start方法的脚本并将其链接到./bin/www

如果您查看该文件,您会发现启动服务器的整个逻辑就在那里。

因此,如果您将start更改为其他内容,例如TurnOn并将执行npm TurnOn,它将执行./bin/www以及整个项目。

项目的结构体全部链接在一起,app.js不足以启动服务器。

希望这有帮助。

答案 3 :(得分:1)

使用Express时,Express实例将为您创建服务器。通常,您的app / index / server.js文件将以以下行开头:

const express = require('express');
const app = express();

这些行需要Express,然后在app变量中实例化Express实例。 Express然后使用var server = http.createServer(app);为您启动服务器。您需要做的就是确保您的应用程序监听该服务器(如您所写)。但是,连接的端口可能会有所不同,因此不建议对其进行硬编码。相反,应该从app变量中检索它:

app.listen(app.get('port'), function(){
    //Something to do when the server starts.
});

此外,在创建自己的app.js文件后,请确保更改package.json文件以通过app.js而不是Express模块​​启动应用程序。默认情况下,package.json可能如下所示:

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

但是在创建了自己的app / index / server.js文件后,您希望节点在启动时开始运行该文件:

"scripts": {
 "start": "node app.js"
}

然后,您可以通过从项目目录中编写npm start来启动您的应用。