2015-10-02 49 views
0

我目前正在尝试自己学习节点js,并且我对JavaScript也是全新的。当我尝试阅读并理解猫鼬时,我找到了这个代码,没有任何解释。这是什么字符串语法意味着在javascripts?

router.js

var url = require('url'); 
var fs = require('fs'); 
exports.get = function(req, res) { 
req.requrl = url.parse(req.url, true); 
var path = req.requrl.pathname; 
if (/\.(css)$/.test(path)){ 
    res.writeHead(200, {'Content-Type': 'text/css'}); 
    fs.readFile(__dirname + path, 'utf8', function (err, data){ 
    if (err) throw err; 
    res.write(data, 'utf8'); 
    res.end(); 
    }); 
} else { 
    if (path === '/' || path === '/home') { 
    require('./controllers/home-mongoose').get(req, res); 
    } else { 
    require('./controllers/404').get(req, res); 
    } 
} 
} 

首先,这是什么exports.get?我有点明白exports = function functionA(){}意味着,当我可以做这样的事情:

var router = require('path/router.js'); 
router.functionA(); 

但我没有得到什么,当你做exports.get这意味着什么。

二,/\.(css)$/.test(path)。我没有得到这种表达式语法,任何人都可以向我解释?由于

回答

1

首先,这是什么exports.get?我有点明白exports = function functionA(){}意味着,当我可以做这样的事情:

var router = require('path/router.js'); 
router.functionA(); 

exports = function functionA(){}其实没有你在想什么。

在节点中,exports只是一个变量,最初是指Object。并且,该行将在该对象上设置一个get属性/方法。

console.log(exports); // {} 

exports.get = function() {}; 

console.log(exports); // { get: function() {} } 

exports是指通常是指到模块/文件时require()返回相同的对象的对象。

// `router` = `module.exports` from `./path/router.js` 
var router = require('./path/router'); 
router.get() 

欲了解更多有关exports,通过Modules documentation阅读的Node.js


其次,/\.(css)$/.test(path)。我没有得到这种表达式语法,任何人都可以向我解释?

该表达式的第一部分/\.(css)$/RegExp literal

/ s是起始和结束分隔符,其行为类似于字符串文字的引号。而且,在它们之间,\.(css)$是被定义的模式。

\.  // match a single period character 
     // escaped to disable the period's "any character" meaning 
(css) // match the 3 characters, "css", within a capture group 
$  // anchor the pattern to the end of the line/string 

表达也可以与RegExp构造函数写为:

new RegExp("\\.(css)$").test(path) // note the extra escape needed for the string 
+0

谢谢,这很清楚:) –

1

这不会做你认为它的作用:

exports = function functionA(){} 

您必须设置module.exports,不exports。此外,你可以使用与:

var router = require('path/router.js'); 
router(); 

因为你设置整个出口,而不是叫functionA属性。

但是,您可以在exports仅有属性:

exports.get = function functionA(){} 

这适用这种方式,因为没有安装一个模块在一个var exports = module.exports = {}module.exports是什么在最后出口。

设置这样的特性意味着,当你需要的模块,您可以使用该属性:

var router = require('path/router.js'); 
router.get(); 

你的第二个问题点,使用正则表达式的行。我建议对它们进行一些研究,或者询问第二个问题,如果你想了解这个特定的问题,但是在Javascript中,你可以用斜杠(/)围绕它们来编写文字正则表达式,就像文字字符串被引号括起来一样("/' )。

+0

谢谢。我得到第一个。我会在reg –

0

/\.(css)$/是一个正则表达式,它所做的是检查给定的路径/文件扩展名是否为“.css”。

有在JavaScript两种方式来构建一个正则表达式:

  1. 使用文字正则表达式:var reg = /[a-b]/;

  2. 或者使用构造函数var reg = new RegExp("[a-b]");

你可以阅读更多关于正则表达式here

而关于第一个问题,因为@Aaron杜福尔已经解释过,我会存入他;)

+0

上做研究,谢谢。我会阅读。虽然我没有足够的权力来upvote你awnser –

+0

我很高兴帮助你:) –

0

1)exports对象就是你使用,使代码提供给其他地方的代码一个文件的对象。所以在你的情况下,exports.get只是定义一个名为“get”的属性,这个属性恰好是一个函数。有关Node.js模块格式的完整概述,请参阅see here

2)/\.(css)$/.test(path)相当于说“嘿,看看变量”路径“,看它是否以”.css“结尾。欲了解更多有关.testsee here的信息。

+0

我明白了。尽管我没有得到'测试'。通常,它应该是其他语言的其他方式,如'path.test(...)'。无论如何,非常感谢 –