Node.js 如何为 module.exports 编写的模块编写方法?

比如给原型链写成的对象添加方法是Array.prototype.inArray = function(){};,那给module.exports编写的模块编写方法呢?

要求是要写在别的js文件里的,因为我想为express增加一些方法,又觉得写在express里不好。

阅读 5.9k
3 个回答

我问着问着,突然想到以前利用module.exports做全局变量的原理,利用这个原理,似乎也能给module.exports的对象添加新的方法!以下是解决方案,不确定是否成功,有待晚上回去测试

a.js//需求是:在其他js文件里给这个a,添加新的方法

module.exports={a:function(){console.('a')}}

b.js//解决方法

var a = require('./a');
a.b = function(){console.log('b')}

page_index.js//某个路由js

var a = require('./a');
a.b();

在app.js引用过一次b之后,也许就可以了!晚上回去试试看!

=========================================
试过之后,发现可用,但是我想添加方法的对象是express.Router,因为express.Router居然是一个可实例化的对象,而且post/get等,是在这个对象的原型链中的,所以我写的对象也最好在其原型链中,所以实际中这样用还是不行的,b.js应该这样:

var express = require('express');
var router_proto = express.Router.__proto__;

router_proto.ajax = function(){
    var args = H.makeArray(arguments);//这个方法自己找吧,就是把arguments变成数组对象而已

    if(args.length==0)throw '参数数量不足';

    if(settings.env=='development'){ //settings是我用来全局保存当前设置的一个对象,自己根据自己的来改这里
        this.get.apply(this,args);
    }
    this.post.apply(this,args);
};

这样新增的方法就能使用this,可以轻松地访问express.Router的属性和方法了。然后在使用这个方法之前require一次这个js,之后就可以用了,用法跟get/post毫无区别,当环境不为development时,则不会处理get请求,蛮方便的。

如上讨论的,用middleware应该可以解决,只接受post的请求,你可以用req.method来判断:

app.use(function(req, res, next) {
  if (req.method === 'POST') {
    next()
  } esle {
    // do whatever
  }
});

// Define your router here
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
1 篇内容引用
推荐问题