javascript - Nodejs 中模块函数/类的实例

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

我有一个以 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;

我在 SafeRequestHandler 中替换了 this.mappings ,例如。这不是一个实例。

所以我尝试了定义处理程序的 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(...)中的映射this 未定义,mappings 未定义

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

谢谢!

最佳答案

如果将特定类实例的方法存储到变量中,您将丢失上下文。

// 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

关于javascript - Nodejs 中模块函数/类的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45569903/

相关文章:

javascript - 如何在页面更改时运行 CoffeeScript ?

c# - 更新页面中的文本框(实时)

javascript - 我无法遵循 Node 初学者书中的以下代码片段

node.js - Nodejs-spawn.stdout 和 process.stdout 之间的区别

javascript - 组件重新渲染时,构造函数中创建的元素未更新

javascript - 显示div类的index()

javascript - 设置 Disqus 话题作者

node.js - 如何使用 nodeJS 和 protobufjs 在 MQTT 中发送缓冲区或字节数组

javascript - 试图在生成器中使用 setTimeout 来控制生成随机数的过程但失败了

javascript - 编译TypeScript时如何处理外部模块?