我最近在本地服务器上安装了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实用程序。
问候。
答案 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
来启动您的应用。