如何从函数内修改 module.exports?
How to modify module.exports from within a function?
所以我的意思是我想在一个函数中导出某个对象。
async function Set(x) {
module.exports["x"] = x
}
这个好像不行,变成undefined了,大家能帮忙吗?
client.on('message', async message => {
if (!message.content.startsWith(prefix) || message.author.bot) return;
var args = message.content.split(/[ ]+/)
const Cargs = message.content.slice(prefix.length).trim().split(/[ ]+/);
const command = Cargs.shift().toUpperCase();
if (client.commands.get(command)) {
await Set(message)
client.commands.get(command).execute()
}
})
从表面上看,你想做的事是完全有可能的。
但是,您需要注意模块和对象引用的性质。
例如,假设我们有您的模块文件:
module.js
const setFn = (x) => {
module.exports.x = x;
}
module.exports = {
x: "hello",
setFn,
}
您将使用导出 x
并使用 index.js
中的 setFn
函数进行修改
此处无法正常工作:
index.js
const {x, setFn} = require("./module");
console.log("Start"); //Start
console.log(x); //hello
setFn("world");
console.log(x); //hello - why hasn't it changed?
console.log("end"); //end
这是因为您已将 直接引用 导入到 x
变量,该变量在需要它时具有值“hello”。
当您稍后通过 setFn
函数改变模块时,您仍然保留对旧“hello”值的引用。
但是,如果您将代码更改为:
const module = require("./module");
console.log("Start"); //Start
console.log(module.x); //hello
module.setFn("world");
console.log(module.x); //world
console.log("end"); //end
然后代码就可以工作了。
这是因为您没有导入对 x
和 setFn
的直接引用,而是导入了对模块本身的引用。
当你改变模块本身,稍后再次参考module.x
,你可以看到更新后的值。
我建议也看看 。这个讲的是ESM模块,不过我觉得教训是一样的。
尽管就您正在做的事情而言 - 我不确定这有多大用处,因为要使其正常工作,它确实需要模块的使用者导入整个模块并始终通过 module.x
.
此外,您确定传递给 Set
函数的值不是未定义的吗?
所以我的意思是我想在一个函数中导出某个对象。
async function Set(x) {
module.exports["x"] = x
}
这个好像不行,变成undefined了,大家能帮忙吗?
client.on('message', async message => {
if (!message.content.startsWith(prefix) || message.author.bot) return;
var args = message.content.split(/[ ]+/)
const Cargs = message.content.slice(prefix.length).trim().split(/[ ]+/);
const command = Cargs.shift().toUpperCase();
if (client.commands.get(command)) {
await Set(message)
client.commands.get(command).execute()
}
})
从表面上看,你想做的事是完全有可能的。
但是,您需要注意模块和对象引用的性质。
例如,假设我们有您的模块文件:
module.js
const setFn = (x) => {
module.exports.x = x;
}
module.exports = {
x: "hello",
setFn,
}
您将使用导出 x
并使用 index.js
setFn
函数进行修改
此处无法正常工作:
index.js
const {x, setFn} = require("./module");
console.log("Start"); //Start
console.log(x); //hello
setFn("world");
console.log(x); //hello - why hasn't it changed?
console.log("end"); //end
这是因为您已将 直接引用 导入到 x
变量,该变量在需要它时具有值“hello”。
当您稍后通过 setFn
函数改变模块时,您仍然保留对旧“hello”值的引用。
但是,如果您将代码更改为:
const module = require("./module");
console.log("Start"); //Start
console.log(module.x); //hello
module.setFn("world");
console.log(module.x); //world
console.log("end"); //end
然后代码就可以工作了。
这是因为您没有导入对 x
和 setFn
的直接引用,而是导入了对模块本身的引用。
当你改变模块本身,稍后再次参考module.x
,你可以看到更新后的值。
我建议也看看
尽管就您正在做的事情而言 - 我不确定这有多大用处,因为要使其正常工作,它确实需要模块的使用者导入整个模块并始终通过 module.x
.
此外,您确定传递给 Set
函数的值不是未定义的吗?