【问题标题】:Starting Express.js Using app.js or 'npm start'?使用 app.js 或“npm start”启动 Express.js?
【发布时间】:2015-12-22 16:51:37
【问题描述】:

我最近在本地服务器上安装了 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;

我知道文件开头需要的实际“express”模块是神奇的地方,但是,当我运行命令行时:

node app.js

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

npm start

一切似乎都很好。我想按原样关注文档,为什么 app.js 无法正常工作?

谢谢。

更新:我的问题与已经发布的另一个问题太相似了,所以我必须明确说明它们有何不同。在另一个问题中,有人在对默认的“app.js”文件运行 Supervisor 命令时质疑他们收到的代码号。

虽然本质上相似,但应该保留这个问题,因为那些对使用我的相同方法感到困惑的人将通过使用“node app.js”关注实际“app.js”文件的身份,而无需完全了解主管实用程序。

问候。

【问题讨论】:

  • 你是从 app.js 所在的文件夹运行 node app.js 吗?
  • 请参阅this answer 以获得解释。
  • @chriskelly ,是的,事实上我正在学习 Node.js 书中的教程。我已经为我的项目创建了几个服务器,并且使用“http-server”和“npm start”都没有问题,但是,这本书虔诚地使用了根文件夹中的“app.js”(就像我一样)并且似乎没有问题。如果可能的话,我想按照书中的说明进行操作。
  • @MatthewBakaitis 我希望我能给你答案,但不幸的是它只是一个评论的答案。谢谢一百万,这真的解释了很多。我对重新启动服务器没有任何问题,我相信我将来会使用 Supervisor。目前,我主要关心的是获得一个强有力的掌握。再次感谢。 (如果您想将您的回复复制并粘贴到我可以检查为已回答的实际评论中,我会立即着手处理)。
  • @chriskelly 老实说,我在理论上一点想法都没有,但作为一个已经创建了一些 server.js 文件的人,主要区别在于默认的 app.js 文件包含在默认的 Express 安装并不完全调用“createServer”表达式或侦听 IP 或端口。可能是因为它是一个基于模板的应用程序,我认为它只是引用了 './bin/www' 目录(这很遗憾,因为我想我可以启动 app.js 文件并立即打开服务器在浏览器中)。

标签: node.js express npm


【解决方案1】:

我是怎么理解的,我刚开始使用node.

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

所以如果你查看 package.json 你会看到这个初始化:

“脚本”:{ “开始”:“节点 ./bin/www” },

因此,您会看到使用 start 方法执行脚本,并且它链接到 ./bin/www

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

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

项目的structor都是链接在一起的,app.js不够启动服务端。

希望这会有所帮助。

【讨论】:

  • 感谢您的回答,因为它使事情更容易理解。似乎默认的 app.js 文件“引用”了将提供文件的位置,但实际上并没有通过 IP 和端口调用服务器(因为 app.js 中没有 createServer 方法)。那种很烂,但你说得更清楚了。再次感谢。
【解决方案2】:

感谢大家的精彩回复,因为他们确实让我了解了 app.js 文件的实际情况以及它在哪里接收到它的功能。感谢 Matthew Bakaitis 和 Bjarni Leifsson 的大力投入。

我要继续回答我自己的问题的唯一原因是,虽然解释了 app.js 文件的性质,但究竟如何从命令行复制调用“node app.js”命令为复制我正在关注的 Node.js 书籍并没有隐含地解决。

在用特定短语“app.js 在以前的 express.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 书,没有其他问题。

【讨论】:

  • 我在 24 小时内阅读 sam 自学 node.js,我偶然发现了同样的问题。
【解决方案3】:

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

答案:

当你使用生成器时,package.json 被配置为 npm start 调用./bin/www。

那个文件包含app.js,在包含之后,调用app.listen。

app.js 不 调用app.listen 这就是为什么如果你直接调用它,它会在没有代码或信息的情况下退出。你必须打电话给./bin/www 或者你必须修改app.js...这样就可以解决你使用生成器的一些原因。

网站上的related question 在尝试使用supervisor 保持应用程序运行但一直得到exit 0 结果时发现了类似的问题。

【讨论】:

    【解决方案4】:

    使用 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 来启动您的应用程序。

    【讨论】:

      猜你喜欢
      • 2015-09-30
      • 2012-07-27
      • 2019-09-29
      • 2021-03-20
      • 1970-01-01
      • 1970-01-01
      • 2018-03-17
      • 1970-01-01
      • 2015-08-19
      相关资源
      最近更新 更多