不解为何这段代码里有exports,module.exports同时存在?
发布于 8 年前 作者 Web-Kevin 5384 次浏览 来自 问答
var logger = require('../common/logger');

module.exports = function (req, res, next) {
  // Assets do not out log.
  if (exports.ignore.test(req.url)) {
    next();
    return;
  }

  var t = new Date();
  logger.info('\n\nStarted', t.toISOString(), req.method, req.url, req.ip);

  res.on('finish', function () {
    var duration = ((new Date()) - t);

    logger.info('Completed', res.statusCode, ('(' + duration + 'ms)').green);
  });

  next();
};

exports.ignore = /^\/(public|agent)/;

这是本站源码里的一段 https://github.com/cnodejs/nodeclub/blob/master/middlewares/request_log.js

因为在查看的资料里知道,如果module.exports,exports同时出现,exports的值会被忽略,那这种写法是啥意思?有些不解

10 回复

@Web-Kevin 你还是对module.exports 与 exports 理解的不彻底, 建议再看看去

@ncuzp 后者是前者的辅助方法,这里exports有了ignore属性,如果引用此文件 exports不成立。 但是否可以直接定义ignore变量 不知理解的对不对

@Web-Kevin 首先你得理解对象的概念, 然后再看这张图, 不知道能不能让你明白~ untitled1.png

@ncuzp 多谢,您看这么理解对不对,如果此文件被A.js加载,在A里是无法使用ignore属性的,只能使用module.exports;在此文件内,ignore是可以使用的,那如果将ignore定义为一个变量再进行正则是否也行? 有啥坏处么?再次感谢

@alsotang 能否帮忙回答下4楼的问题?多谢 是否 exports.ignore充当了全局变量 为何不直接用var声明 有啥区别么?

@alsotang 能否帮忙回答下4楼的问题?多谢 是否 exports.ignore充当了全局变量 为何不直接用var声明

@Web-Kevin 这段代码有错误,module.exports 那个地方应该写成 exports = module.exports = xxx

我去改一下

@Web-Kevin 我把这个 ignore 写成 var ignore = function () {} 算了,这代码当时合并的时候不够细心,sorry

请看: var obj={}; obj.name=“tom”;

@alsotang 谢谢回答哈

回到顶部