Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript nodejs中模块函数/类的实例_Javascript_Node.js_Ecmascript 6_Ecmascript 5_Multiple Instances - Fatal编程技术网

Javascript nodejs中模块函数/类的实例

Javascript nodejs中模块函数/类的实例,javascript,node.js,ecmascript-6,ecmascript-5,multiple-instances,Javascript,Node.js,Ecmascript 6,Ecmascript 5,Multiple Instances,我有一个以ES5.1开始的项目,后来我将其更改为支持ES6,所以我使用了async await,let 现在我需要一个类似实例的模块/对象 我找到了一篇解释这个过程的帖子,但是 当我这样做时: 'use strict'; let _ = require('lodash'); var mappings; function SafeRequestHandler(reqMappings) { if (!(this instanceof SafeRequestHandler)) {

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

现在我需要一个类似实例的模块/对象

我找到了一篇解释这个过程的帖子,但是

当我这样做时:

'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(…)
中找到
映射<代码>此
未定义,
映射
未定义

我想我只是不完全理解基本原理,所以你能纠正并解释这两种方法的错误吗


谢谢

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

 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;

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

//句柄没有指向其上下文的指针(也称为this)
让handle=新的SafeRequestHandler(handlerMappings);
//因此handle()将输出无法读取未定义的属性映射
将其更改为:

const instance=新的SafeRequestHandler(handlerMappings);
常量句柄=(…args)=>instance.safeHandleReq(…args);

这里的进一步信息:

不,ES6方法应该可以很好地工作。。我找不到“映射”,一切都是未定义的没有,很好。你会遇到什么错误?TypeError:无法读取未定义的属性“mappings”.我得到了:/@greengold然后有一些linter/等。你的代码做了非常糟糕的事情:/相信我,我是最小的,我不使用linter这样的东西。我唯一担心的是我在7.7.3上混合了ES5和ES6。。。已经为此花费了数小时:(