英文:
Can export a class, but can not export a functions in JS
问题
I use different tech stacks for a current project and some things learn on the fly. I am not confident with different JS standards and their use cases. At this moment I have TypeError: chain.getSwapChainContractInstance is not a function
which is a valid and exported function.
It is exported in a common for the project way via exports.getSwapChainContractInstance = function() { /* the rest of the code */}
.
The module class is imported like this:
const chain = require('../models/chain/chain');
const { SwapToken, SwapChainV2 } = require('../models/chain/chain');
The whole code of the module is:
const { ethers } = require("ethers");
const config = require('config');
class Contract {
constructor() {}
getWalletWithProvider(privateKey, nodeUrl) {
let provider = new ethers.providers.JsonRpcProvider(nodeUrl)
let walletWithProvider = new ethers.Wallet(privateKey, provider);
return walletWithProvider;
}
}
class SwapToken extends Contract {
constructor(privateKey, nodeUrl, contractAddress) {
super();
console.log(`${JSON.stringify(privateKey)}, ${JSON.stringify(nodeUrl)}, ${JSON.stringify(contractAddress)}`)
let swapTokenAbiJson = [
"function balanceOf(address owner) public view virtual override returns (uint256)",
];
this.signerInstance = this.getWalletWithProvider(privateKey, nodeUrl);
this.swapTokenContract = new ethers.Contract(
contractAddress,
swapTokenAbiJson,
this.signerInstance
);
}
async balanceOf(address) {
return await this.swapTokenContract.balanceOf(address);
}
}
class SwapChainV2 extends Contract {
constructor(privateKey, nodeUrl, contractAddress) {
super();
let swapChainAbiJson = [
"function registerUser(address user) public override",
"function getUsers() public view override returns (address[] memory)",
"function getMatches(address userFirst, address userSecond) external view override returns ((address,uint,address,uint,bool,bool)[])"
];
this.signerInstance = this.getWalletWithProvider(privateKey, nodeUrl);
this.swapChainContract = new ethers.Contract(
contractAddress,
swapChainAbiJson,
this.signerInstance
);
}
async getMatches(userFirstAddress, userSecondAddress) {
return await this.swapChainContract.getMatches(userFirstAddress, userSecondAddress);
}
async getUsers() {
return await this.swapChainContract.getUsers();
}
}
/**
* FIXME: by some reason I can not import it and use in the usual way
*/
exports.getSwapChainContractInstance = function() {
let nodeUrl = `http://${config.get("chain").host}:${config.get("chain").port}`;
let privateKey = config.get("chain").privateKey;
let swapChainAddress = config.get("chain").swapChainV2Address;
return new SwapChainV2(privateKey, nodeUrl, swapChainAddress);
}
/**
* FIXME: by some reason I can not import it and use in the usual way
*/
exports.getSwapValueContractInstance = function() {
let nodeUrl = `http://${config.get("chain").host}:${config.get("chain").port}`;
let privateKey = config.get("chain").privateKey;
let swapTokenAddress = config.get("chain").swapTokenAddress;
return new SwapToken(privateKey, nodeUrl, swapTokenAddress);
}
module.exports = { SwapToken, SwapChainV2 }
英文:
I use different tech stacks for a current project and some things learn on the fly. I am not confident with different JS standards and their use cases. At this moment I have TypeError: chain.getSwapChainContractInstance is not a function
which is a valid and exported function.
It is exported in a common for the project way via exports.getSwapChainContractInstance = function() { /* the rest of the code */}
.
The module class is imported like this:
const chain = require('../models/chain/chain');
const { SwapToken, SwapChainV2 } = require('../models/chain/chain');
The whole code of the module is:
const { ethers } = require("ethers");
const config = require('config');
class Contract {
constructor() {}
getWalletWithProvider(privateKey, nodeUrl) {
let provider = new ethers.providers.JsonRpcProvider(nodeUrl)
let walletWithProvider = new ethers.Wallet(privateKey, provider);
return walletWithProvider;
}
}
class SwapToken extends Contract {
constructor(privateKey, nodeUrl, contractAddress) {
super();
console.log(`${JSON.stringify(privateKey)}, ${JSON.stringify(nodeUrl)}, ${JSON.stringify(contractAddress)}`)
let swapTokenAbiJson = [
"function balanceOf(address owner) public view virtual override returns (uint256)",
];
this.signerInstance = this.getWalletWithProvider(privateKey, nodeUrl);
this.swapTokenContract = new ethers.Contract(
contractAddress,
swapTokenAbiJson,
this.signerInstance
);
}
async balanceOf(address) {
return await this.swapTokenContract.balanceOf(address);
}
}
class SwapChainV2 extends Contract {
constructor(privateKey, nodeUrl, contractAddress) {
super();
let swapChainAbiJson = [
"function registerUser(address user) public override",
"function getUsers() public view override returns (address[] memory)",
"function getMatches(address userFirst, address userSecond) external view override returns ((address,uint,address,uint,bool,bool)[])"
];
this.signerInstance = this.getWalletWithProvider(privateKey, nodeUrl);
this.swapChainContract = new ethers.Contract(
contractAddress,
swapChainAbiJson,
this.signerInstance
);
}
async getMatches(userFirstAddress, userSecondAddress) {
return await this.swapChainContract.getMatches(userFirstAddress, userSecondAddress);
}
async getUsers() {
return await this.swapChainContract.getUsers();
}
}
/**
* FIXME: by some reason I can not import it and use in the usual way
*/
exports.getSwapChainContractInstance = function() {
let nodeUrl = `http://${config.get("chain").host}:${config.get("chain").port}`;
let privateKey = config.get("chain").privateKey;
let swapChainAddress = config.get("chain").swapChainV2Address;
return new SwapChainV2(privateKey, nodeUrl, swapChainAddress);
}
/**
* FIXME: by some reason I can not import it and use in the usual way
*/
exports.getSwapValueContractInstance = function() {
let nodeUrl = `http://${config.get("chain").host}:${config.get("chain").port}`;
let privateKey = config.get("chain").privateKey;
let swapTokenAddress = config.get("chain").swapTokenAddress;
return new SwapToken(privateKey, nodeUrl, swapTokenAddress);
}
module.exports = { SwapToken, SwapChainV2 }
答案1
得分: 2
在一个CommonJS模块中,exports
的值是一个被导出的对象。默认情况下,它是一个空对象。
首先,你对这个对象进行了改变,添加了一个函数。
exports.getSwapChainContractInstance = function()
然后,你再次对它进行了修改,添加了第二个函数。
exports.getSwapValueContractInstance = function() {
然后,你用一个新的对象替换了整个对象,这个新对象导出了类。
module.exports = { SwapToken, SwapChainV2 }
你导出的新对象不包含你分配给旧对象的这两个函数。
选择一种方法来设置你的导出:
- 修改对象四次,添加四个属性
- 一次性用一个已经包含所有四个属性的新对象替换原对象
英文:
In a CommonJS module, the value of exports
is an object that is exported. By default it is an empty object.
First you mutate the object to add a function to it.
> exports.getSwapChainContractInstance = function()
Then you mutate it again to add a second function to it.
> exports.getSwapValueContractInstance = function() {
Then you replace the whole object with a new one which exports the classes.
> module.exports = { SwapToken, SwapChainV2 }
The new object you are exporting doesn't have the two function you assigned to the old object.
Pick one method for setting your exports:
- Mutate the object four times to add the four properties
- Replace the object once with a single new object that already has all four properties
答案2
得分: -4
export function getSwapChainContractInstance() {
// your code
}
英文:
export function getSwapChainContractInstance() {
// your code
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论