我对nodejs相当新,并且一直在查看一些代码并尝试理解它。有人可以请我帮忙,帮助我理解下面的代码片段。我的问题可能非常基本,但请理解我正在学习nodejs并表达并且一直在努力理解一些现有的代码。我用数字标记了代码行,问题由相同的数字构成。
var ChatApp = global.ChatApp = {}
, conf = ChatApp.conf = require('./conf').config (1)
, http = require('http') (2)
, path = require('path') (3)
, express = require('express')
, app = express()
;
app.set('views', __dirname + '/views');
app.set('view engine', 'jade');
app.use(express.logger('dev')); (6)
app.use(express.bodyParser()); (7)
app.use(express.methodOverride()); (8)
app.use(express.cookieParser('your secret here')); (9)
app.use(express.session({secret: 'PTKACSxSq24PlZ9IAPRMy3_2'})); (10)
app.all('*', function(req, res, next) {
var oneof = false;
if(req.headers.origin) {
res.header('Access-Control-Allow-Origin', req.headers.origin);
oneof = true;
}
if(req.headers['access-control-request-method']) {
res.header('Access-Control-Allow-Methods', req.headers['access-control-request-method']);
oneof = true;
}
if(req.headers['access-control-request-headers']) {
res.header('Access-Control-Allow-Headers', req.headers['access-control-request-headers']);
oneof = true;
}
if(oneof) {
res.header('Access-Control-Max-Age', 60 * 60 * 24 * 365);
} (11)
// intercept OPTIONS method
if (oneof && req.method == 'OPTIONS') {
res.send(200);
}
else {
next();
}
}); (12)
app.use(app.router); (13)
app.use(express.static(path.join(__dirname, 'public')));
if ('development' == app.get('env')) {
app.use(express.errorHandler());
} (15)
server = http.createServer(app); (16)
require('./lib/chat').init(server); (17)
(1)我理解除了conf = ChatApp.conf = require('./conf').config
之外还需要什么?我们是否正在制作变量conf并使其与ChatApp相同。 CONF?需求是否指向parent directory/conf/config
?我问这个是因为在我父目录中存在这个文件,没有conf文件夹。只有一个conf。 js文件,但它包含在此变量中(使用console.log检查)。怎么会发生?
(2),(3)require(http)
和要求(路径)。为什么需要包含http和路径?这两个解决了什么目的?
(6)app.use(express.logger('dev'))从快递网站,它用于记录每个请求。我的问题是函数中的参数dev是什么?这是一条路吗?
(7)app.use(express.bodyParser())
:来自快递网站:请求正文解析支持JSON,urlencoded和多部分请求的中间件。这个中间件只是json(),urlencoded()和multipart()中间件的包装器。但这究竟意味着什么? express.bodyparser做什么用?
(8)app.use(express.methodOverride());
快递网站上没有解释。不确定它的含义以及为什么使用它。
(9)express.cookieparser
解析cookie头字段。但是cookie中的头字段是什么。据我所知,浏览器cookie具有以下字段。名称,内容,域,路径,发送,过期。
(10)app.use(express.session({secret: 'PTKACSxSq24PlZ9IAPRMy3_2'}));
我找不到任何名为express.session()的方法。它做了什么?
(12)对于代码片段12,我无法理解我们想用它实现什么?
(13)app.use(app.router)当我做了app.router的console.log时,它给了我这个
function router(req, res, next){
self._dispatch(req, res, next);
}
知道为什么我们这样做?它似乎是一个通用的路由器功能,但为什么需要包含它?
(15)app.get.env
给了我开发,它来自express/lib/application.js
内的文件。我们为什么要做这个测试?
(16)这完全令人困惑。我见过这个
var server = http.createServer() and var app = express()
这意味着express中有一个内置的http服务器,但为什么会http.createserver(express())
或http.createserver(app)
?
(17)我的app根目录中有一个lib / chat文件夹,但它有一大堆带有index.js文件的文件。是否将index.js文件包含在该文件夹中的所有js文件中?为什么是init服务器?
任何人的任何帮助都会受到很大的影响。
答案 0 :(得分:4)
以下答案不会告诉您以下内容:HTTP请求,REST,会话。还要注意,你再也不会回答这么多问题了。
(1)我理解除了
conf = ChatApp.conf = require('./conf').config
之外还需要什么?我们是否正在变量conf
并使其等于ChatApp.conf
?
是
还需要指向父目录/ conf / config?
没有。它要求./conf.js
或./conf.node
,.js
是首选。该模块导出一个config
字段,可以访问该字段。
对于基于路径的函数,HTTP服务器(2),(3)要求(http)和要求(路径)。为什么需要包含http和路径?这两个解决了什么目的?
http
需要 path
。
(6)app.use(express.logger('dev'))从快递网站,它用于记录每个请求。我的问题是函数中的参数dev是什么?这是一条路吗?
这是logger middleware from Connect:
dev
根据开发使用的响应状态着色的简明输出(7)app.use(express.bodyParser()):来自快递网站:请求正文解析支持JSON,urlencoded和多部分请求的中间件。这个中间件只是json(),urlencoded()和multipart()中间件的包装器。但这究竟意味着什么? express.bodyparser做什么用?
它使您能够解析HTTP请求的正文。如果您不知道HTTP请求是什么,您可以停下来阅读其余的答案,了解一下HTTP,然后再回过头来看看。
(8)app.use(express.methodOverride());快递网站上没有解释。不确定它的含义以及为什么使用它。
大多数网络浏览器仅支持HTTP动词GET和POST。但是,为了提供RESTful服务(另一个花哨的单词),还需要PUT / PATCH和DELETE。 methodOveride
可让您创建将通过POST发送的表单,但会根据其_method
属性进行解释。
(9)express.cookieparser解析cookie头字段。但是cookie中的头字段是什么。据我所知,浏览器cookie具有以下字段。名称,内容,域名,路径,发送,过期。
那么,还记得HTTP请求吗? Cookie会在浏览器的HTTP请求标头中发送。这是Cookie:
标题。
(10)app.use(express.session({secret:'PTKACSxSq24PlZ9IAPRMy3_2'}));我找不到任何名为express.session()的方法。它做了什么?
它使您可以使用会话。
(12)对于代码片段12,我无法理解我们想用它实现什么?
此片段解决了cross-site requests的访问控制问题。
(13)app.use(app.router)当我做了app.router的console.log时,它给了我这个
function router(req, res, next){ self._dispatch(req, res, next); }
知道为什么我们这样做?它似乎是一个通用的路由器功能,但为什么需要包含它?
app.router
将路由请求。例如app.get('/hello-world')´ will take all requests with
GET / hello-world . You need to use
app.router`以启用此行为。
(15)app.get.env给了我开发,它来自express / lib / application.js中的文件。我们为什么要做这个测试?
因为我们想用错误的错误消息处理错误。
(16)这完全令人困惑。我已经看到这个var server = http.createServer()和var app = express()这意味着express里面有一个内置的http服务器但是为什么要做http.createserver(express())或http.createserver(app) ?
因为这是快速的3.x方式,所以它不再带有完全成熟的http服务器。通过这种方式,您可以将app
用作许多其他内容的回调。
(17)我的app根目录中有一个lib / chat文件夹,但它有一大堆带有index.js文件的文件。是否将index.js文件包含在该文件夹中的所有js文件中?为什么是init服务器?
它包含index.js
。 init(server)
可能会对服务器做一些事情。您需要检查相应的文件。