如何覆盖所有项目文件中从“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"
});
我想通了
S3.prototype.upload = (params: S3.Types.PutObjectRequest, options?: ManagedUpload.ManagedUploadOptions) => {
// Custom
};
在 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;