这个字符串语法在javascripts中意味着什么?

What's this string syntax means in javascripts?

我目前正在尝试自己学习 node js,而且我对 javascript 也是全新的。当我尝试阅读和理解猫鼬时,我发现了这段代码,没有任何解释。

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)。我不明白这个表达式语法,任何人都可以向我解释一下吗?谢谢

这与您认为的不同:

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 中,你可以通过用斜杠 (/) 包围它们来编写文字正则表达式,就像文字字符串一样被引号包围 ("/').

/\.(css)$/ 是一个正则表达式,它的作用是检查给定的 path/file 扩展名是否为“.css”.

javascript中有两种构造正则表达式的方法:

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

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

您可以阅读有关正则表达式的更多信息here

关于第一个问题,因为@Aaron Dufour 已经解释过了,我相信他 ;)

First of all, what is this exports.get ? I kind of understand that exports = function functionA(){} means that when I can do something like this :

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

exports = function functionA(){}其实并没有按照你的想法去做

在 Node 中,exports 只是一个最初引用 Object 的变量。并且,该行正在该对象上设置 get property/method。

console.log(exports); // {}

exports.get = function () {};

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

exports 引用的对象通常与 require() returns 引用 module/file.

的对象相同
// `router` = `module.exports` from `./path/router.js`
var router = require('./path/router');
router.get()

有关 exports 的更多信息,请通读 Node.js

Modules documentation

Second, /\.(css)$/.test(path). I don't get this expression syntax, anyone can explain it to me ?

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

/ 是开始和结束分隔符,其行为类似于字符串文字周围的引号。并且,在它们之间,\.(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

1) exports 对象只是一个对象,您可以使用它使一个文件中的代码可用于其他地方的代码。因此,在您的情况下,exports.get 只是定义了一个名为 "get" 的 属性,而这个 属性 恰好是一个函数。要全面了解 Node.js 模块格式,see here

2) /\.(css)$/.test(path) 相当于说 "hey, look at the variable "path" 并查看它是否以 ".css" 结尾。有关 .test 的更多信息 see here.