【问题标题】:nodejs calling to function from inside an object in modulenodejs从模块中的对象内部调用函数
【发布时间】:2014-01-24 22:39:52
【问题描述】:

我有以下模块:

var util = require('util');
var events = require('events');
exports.IncomingMessage=IncomingMessage;

var IncomingMessage = function (){
    events.EventEmitter.call(this);
    this.headers={};
    this.httpVersion='';
    this.method='';
    this.socket='';
    this.ready=function(){
        console.log('should emit ready');
        //this.emit('ready');
    }

}

在我的代码中,我正在做:

var req=require('./newIncomingMessage');

然后当我打电话时:

req.ready();

我收到一个错误:

TypeError : Object #<Object> has no method 'ready'

这是为什么呢?我错过了什么?

【问题讨论】:

    标签: node.js function object


    【解决方案1】:

    嗯,我无法从上面的答案中理解为什么这种方法不起作用。但这就是我最终使用的:

    module.exports = IncomingMessage;
    
    function IncomingMessage() {
        this.headers={};
            this.httpVersion='';
            this.method='';
            this.socket='';
        }
    IncomingMessage.prototype.ready=function(){
        console.log('Inside ready function');
    }
    

    【讨论】:

    • javascript中推荐这种方式;将函数放入构造函数中存在性能和内存问题。使用原型是更好的解决方案。您也可以使用模块模式创建模块,它与节点和模块配合得很好。
    【解决方案2】:

    只是没有识别 IncomingMessage 在定义之前被使用。

    var util = require('util');
    var events = require('events');
    exports.IncomingMessage = new function(){
      events.EventEmitter.call(this);
      this.headers={};
      this.httpVersion='';
      this.method='';
      this.socket='';
      this.ready=function(){
        console.log('should emit ready');
        //this.emit('ready');
      };
    };
    

    在使用之前

    var iMsg=require('./newIncomingMessage').IncomingMessage;
    

    然后你就可以使用它了:

    iMsg.ready();
    

    关于它的简要说明是:

    您可以将新的function(){} 视为{},但比{} 更多,因为您可以在这个封闭范围内做更多的事情。

    在这个例子中,只是拼写错误

    typeof iMsg

    你会得到一个

    'object'.

    【讨论】:

    • 我应该更改导出还是不应该?你的建议只给我同样的错误......
    【解决方案3】:

    您缺少module.exports = ... 来说明您需要时应该输出什么。如果你想让它导出一个有.ready函数的对象,你还需要

    ....
    module.exports = { ready: function() { ... } };
    

    也就是说,我在你的模块中没有看到任何看起来像准备好的函数的代码,所以一个更好的问题是“你想用这个代码做什么”。

    在一个相对重要的注意事项上:req 是一个通常为 http 请求对象(在普通 nodejs 或 connect/express 中)保留的 var 名称,因此您将使用它作为您的许多其他 Node 开发人员变量名。

    【讨论】:

    • 但是 .method 和所有其他的都在工作......那么为什么这个功能不呢?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-27
    • 2017-02-22
    • 2019-12-16
    • 2021-03-11
    相关资源
    最近更新 更多