NodeJS代码理解

时间:2013-11-20 23:12:11

标签: node.js express

我对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服务器?

任何人的任何帮助都会受到很大的影响。

1 个答案:

答案 0 :(得分:4)

声明

以下答案不会告诉您以下内容:HTTP请求,REST,会话。还要注意,你再也不会回答这么多问题了。

的答案

  

(1)我理解除了conf = ChatApp.conf = require('./conf').config之外还需要什么?我们是否正在变量conf并使其等于ChatApp.conf

  

还需要指向父目录/ conf / config?

没有。它要求./conf.js./conf.node.js是首选。该模块导出一个config字段,可以访问该字段。

  

(2),(3)要求(http)和要求(路径)。为什么需要包含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.jsinit(server)可能会对服务器做一些事情。您需要检查相应的文件。

相关问题