【问题标题】:Imported function is undefined when used in module.exports在 module.exports 中使用时,导入的函数未定义
【发布时间】:2020-02-27 16:23:58
【问题描述】:

我有一个这样的js文件:

const {foo} = require('some-lib')

console.log(foo === undefined)  // for testing only

module.exports = {
    async bar() {
        let baz = foo();
    }
}

这让我error TypeError: Cannot read property 'foo' of undefined,即使 console.log 打印错误。这里发生了什么?

(实际代码大致是第二个例子here,我正在尝试使用buildQuery函数。)

编辑: 根据请求,这是一个最小的可重现示例:

  1. 使用 quickstart 设置安装 Strapi (yarn create strapi-app my-project --quickstart)
  2. 在运行 Strapi 的情况下,转到 localhost:1337/admin,单击边栏中的 Content Type Builder,然后创建一个最小的 article 内容类型。它只需要标题“文章”,不需要其他属性。
  3. Roles & Permissions 中,转到public 并全选,然后保存。
  4. 现在将my-project/api/article/services/article.js 修改为如下所示:
'use strict';

const {buildQuery} = require('strapi-utils');

module.exports = {
  find() {buildQuery({model: 'article'})}
};

这会在调用localhost:1337/article 时出现上述错误。请注意,该示例几乎是从 Strapi 的 documentation 中逐字提取的,还要注意 console.log(buildQuery === undefined) 在导入后直接打印 false。

EDIT2:

看来这实际上是 Strapi 中的一个错误,我在他们的 GitHub 存储库上打开了一个问题:https://github.com/strapi/strapi/issues/5306

【问题讨论】:

  • some-lib 没有公开任何内容,您可以查看node_modules/some-lib 文件夹中的代码
  • some-lib 没有名为 foo 的命名导出。不要试图将代码抽象到无用的程度——所提问题的答案是显而易见的。
  • 错误来自const {foo} = require('some-lib') 行。
  • 你如何使用这个模块?你导出bar()函数..不是foo
  • 如果没有一个最小的、可重现的例子,恐怕很难进一步帮助您。

标签: javascript node.js node-modules strapi


【解决方案1】:

记住 require() 是返回一个承诺,

const {foo} = require('some-lib')

module.exports = {
bar : async  ()=>{
let baz = foo();
return baz;
                }
            }

这个返回栏是否应该作为一个模块包含 foo

【讨论】:

  • 我不确定我是否理解正确,但我想我就是这样做的,不是吗?
  • 在您的示例中,您正在执行此操作 ' module.exports = { async bar() { let baz = foo(); } }' 它应该返回 {bar:undefined} 我认为因为 bar() 是无效的,不返回任何东西
【解决方案2】:

试试看:

const { foo } = require("some-lib");

console.log(foo === undefined); // for testing only

exports.foo = async () => {
  let baz = foo();
  return baz;
  //or just return foo();
};

【讨论】:

  • 这读起来更像是一个找不同的游戏,而不是一个答案。您似乎建议从 some-lib 读取不同的属性。是什么让您认为存在不同的属性?
  • 这是一个错误,它应该是 const {foo} = require('some-lib') 与示例相同,除了这样的导出应该可以正常工作,否则会出现问题''some-lib'' 本身
猜你喜欢
  • 1970-01-01
  • 2018-09-06
  • 2021-12-07
  • 1970-01-01
  • 2020-05-12
  • 2020-05-31
  • 1970-01-01
  • 2011-11-07
  • 2019-09-29
相关资源
最近更新 更多