【问题标题】:instances of module functions/classes in nodejsnodejs中模块函数/类的实例
【发布时间】:2018-01-16 02:48:33
【问题描述】:

我有一个项目以 ES5.1 开始,后来我将其更改为支持 ES6,所以我使用的是 async-await,让...

现在我需要有类似实例的模块/对象。

我发现 this 帖子解释了这个过程,但是......

当我这样做时:

'use strict';

let _ = require('lodash');
var mappings;

function SafeRequestHandler(reqMappings) {

    if (!(this instanceof SafeRequestHandler)) {
        return new SafeRequestHandler((reqMappings));
    }

    mappings = reqMappings;
}

function safeHandleReq(req, res) {
    try {
        let pair = _.find(mappings, {'url': req.url});
        return pair.handler(req, res);
    } catch (err) {
        console.log(err);
    }
}

SafeRequestHandler.prototype.safe = safeHandleReq;

module.exports = SafeRequestHandler;

但现在,每次我这样做:

var handler = require('../util/safeRequestHandler');

let handlerMappings = [
    {
        url: def.party_create,
        handler: partyCreate
    },
    {
        url: def.party_modify,
        handler: partyModify
    },
    {
        url: def.party_get,
        handler: partyGet
    }
];

var handle = new handler(handlerMappings).safe;

我得到this.mappings 替换为SafeRequestHandler 例如。这不是一个实例。

所以我尝试了定义处理程序的 ES6 方法:

'use strict';

let _ = require('lodash');

class SafeRequestHandler {

    constructor(reqMappings) {
        this.mappings = reqMappings;
    }

    safeHandleReq(req, res) {
        try {
            let pair = _.find(this.mappings, {'url': req.url});
            return pair.handler(req, res);
        } catch (err) {
            console.log(err);
        }
    }

}

并像这样实例化它:

let handlerMappings = [
    {
        url: def.party_create,
        handler: partyCreate
    },
    {
        url: def.party_modify,
        handler: partyModify
    },
    {
        url: def.party_get,
        handler: partyGet
    }
];

let handle = new SafeRequestHandler(handlerMappings).safeHandleReq;

..但是这样我什至无法在safeHandleReq(...) 中联系mappingsthis 未定义,mappings 未定义

我想我只是没有完全理解基本原理,所以请您纠正并解释这两种方法有什么问题?

谢谢!

【问题讨论】:

  • 没有 ES6 方式应该可以正常工作。
  • 好吧,正如我所说.. 我无法到达“映射”,一切都未定义
  • 不,没关系。你得到什么错误?

标签: javascript node.js ecmascript-6 ecmascript-5 multiple-instances


【解决方案1】:

如果将特定类实例的method 存储到变量中,则会丢失上下文。

// handle doesn't have a pointer to its context (aka, this)
let handle = new SafeRequestHandler(handlerMappings).safeHandleReq;
// so handle() will output cannot read property mappings of undefined

改成:

const instance = new SafeRequestHandler(handlerMappings);

const handle = (...args) => instance.safeHandleReq(...args);

更多信息在这里:Losing "this" context in JavaScript when passing around members

【讨论】:

    【解决方案2】:

    您的第一个代码创建了一个全局变量,因此只有 一个 值。您也可以在那里使用 this

     let _ = require('lodash');
    function SafeRequestHandler(reqMappings) {
      if (!(this instanceof SafeRequestHandler)) {
        return new SafeRequestHandler((reqMappings));
      }
       this.mappings = reqMappings;
    }
    
    SafeRequestHandler.prototype.safeHandleReq =  function(req, res) {
        try {
            let pair = _.find(this.mappings, {'url': req.url});
            return pair.handler(req, res);
        } catch (err) {
            console.log(err);
        }
    }
    module.exports = SafeRequestHandler;
    

    【讨论】:

    • TypeError: Cannot read property 'mappings' of undefined ..我明白了:/
    • @greengold 然后还有一些 linter/etc。用你的代码做非常非常糟糕的事情:/
    • 相信我,我是最小的,我不使用 linter 这样的东西。我唯一担心的是我在 7.7.3 上将 ES5 和 ES6 混合在一起......已经花了几个小时:(
    猜你喜欢
    • 1970-01-01
    • 2021-03-13
    • 2021-06-10
    • 1970-01-01
    • 1970-01-01
    • 2018-08-16
    • 1970-01-01
    • 2012-07-29
    • 1970-01-01
    相关资源
    最近更新 更多