Node.js 覆盖模块的类函数

问题描述 投票:0回答:2

如何覆盖所有项目文件中从“aws-sdk”模块导入的S3类的上传方法?

import {S3} from "aws-sdk";
const s3 = new S3({
    region: "us-east-1"
});
s3.upload({
    Bucket: "bucket",
    Key: "file",
    Body: "content",
    ACL: "private"
});
node.js
2个回答
0
投票

我想通了

    S3.prototype.upload = (params: S3.Types.PutObjectRequest, options?: ManagedUpload.ManagedUploadOptions) => {
           // Custom
    };

0
投票

在 Node.js 中,您可以通过简单地在模块的导出对象中重新分配类名的值来覆盖模块中的类。

例如,假设您有一个名为

myModule.js
的模块和一个名为
MyClass
的类:

// myModule.js
class MyClass {
  constructor() {
    console.log("MyClass constructor called");
  }

  myMethod() {
    console.log("MyClass method called");
  }
}

module.exports = {
  MyClass: MyClass,
};

要覆盖

MyClass
,您可以简单地在您的应用程序代码中重新分配
MyClass
的值:

// app.js
const myModule = require("./myModule");

class MySubClass extends myModule.MyClass {
  myMethod() {
    console.log("MySubClass method called");
  }
}

myModule.MyClass = MySubClass;

const myObj = new myModule.MyClass();
myObj.myMethod(); // Output: "MySubClass method called"

在上面的例子中,我们定义了一个扩展

MySubClass
的子类
MyClass
,然后我们将
MyClass
模块中的
myModule
重新分配为
MySubClass
。现在,当我们使用
MyClass
创建
new myModule.MyClass()
的实例时,我们实际上得到了一个
MySubClass
的实例,它覆盖了
myMethod()
方法以记录不同的消息。

为什么

prototype
不有趣?因为使用
prototype
this
不起作用。而且我无法解释为什么^^“

其他例子:

const express = require('express');
const { ExpressPeerServer } = require('peer');

const { v4: uuidV4 } = require('uuid');
const realm = require('peer/dist/src/models/realm');

const app = express();

app.enable('trust proxy');

const PORT = process.env.PORT || 9000;
const server = app.listen(PORT, () => {
  console.log(`App listening on port ${PORT}`);
  console.log('Press Ctrl+C to quit.');
});

class NewRealm extends realm.Realm {
  generateClientId() {
    let size = 4;
    let clientId = uuidV4().substring(0, size);
    while (this.getClientById(clientId)) {
      clientId = uuidV4().substring(0, size);
      size++;
    }
    return clientId;
  }
}

realm.Realm = NewRealm;

const peerServer = ExpressPeerServer(server, {
  path: '/'
});

app.use('/peer', peerServer);

module.exports = app;
© www.soinside.com 2019 - 2024. All rights reserved.