TypeError:x 不是 Node.js 中的函数

Posted

技术标签:

【中文标题】TypeError:x 不是 Node.js 中的函数【英文标题】:TypeError: x is not a function in Node.js 【发布时间】:2018-11-26 13:37:24 【问题描述】:

我正在开发一个 Electron 应用程序,我的目标是“拆分”index.js(主进程)文件。目前,我已将与菜单栏相关和与触控栏相关的代码放入两个单独的文件中,menu.jstouchBar.js。这两个文件都依赖于一个名为redir 的函数,该函数位于index.js 中。每当我尝试在我的菜单栏中激活 click 事件时 - 它依赖于 redir - 我都会收到错误消息:

TypeError: redir is not a function。这也适用于我的 Touch Bar 代码。

这是我的(截断的)文件:

index.js

const  app, BrowserWindow  = require('electron'); // eslint-disable-line
const initTB = require('./touchBar.js');
const initMenu = require('./menu.js');

...

let mainWindow; // eslint-disable-line

// Routing + IPC
const redir = (route) => 
  if (mainWindow.webContents) 
    mainWindow.webContents.send('redir', route);
  
;
module.exports.redir = redir;

function createWindow() 
  mainWindow = new BrowserWindow(
    height: 600,
    width: 800,
    title: 'Braindead',
    titleBarStyle: 'hiddenInset',
    show: false,
    resizable: false,
    maximizable: false,
  );

  mainWindow.loadURL(winURL);
  initMenu();
  mainWindow.setTouchBar(initTB);

  ...



app.on('ready', createWindow);

...

menu.js

const redir = require('./index');
const  app, Menu, shell  = require('electron'); // eslint-disable-line

// Generate template
function getMenuTemplate() 
  const template = [

    ...

    
      label: 'Help',
      role: 'help',
      submenu: [
        
          label: 'Learn more about x',
          click: () => 
            shell.openExternal('x'); // these DO work.
          ,
        ,

        ...

      ],
    ,
  ];

  if (process.platform === 'darwin') 
    template.unshift(
      label: 'Braindead',
      submenu: [

        ...

        
          label: 'Preferences...',
          accelerator: 'Cmd+,',
          click: () => 
            redir('/preferences'); // this does NOT work
          ,
         

        ...

      ],
    );

    ...

  ;

  return template;


// Set the menu
module.exports = function initMenu() 
  const menu = Menu.buildFromTemplate(getMenuTemplate());
  Menu.setApplicationMenu(menu);
;

我的文件结构很简单——三个文件都在同一个目录中。

也欢迎任何代码批评;我花了好几个小时努力想弄清楚这一切。

【问题讨论】:

【参考方案1】:

redir 它不是一个函数,因为您正在导出一个对象,其中包含一个 redir 属性,它是一个函数。

所以你应该使用:

const  redir  = require('./index.js');

或者这样导出

module.exports = redir

当你这样做时:module.exports.redir = redir;

您正在导出: redir: [Function]

【讨论】:

【参考方案2】:

您正在导出

module.exports.redir = redir;

这意味着你的导入

const redir = require('./index');

是导出的对象。 redir 恰好是它的关键之一。要使用该功能,请使用

const redir = require('./index').redir;

或者直接解构成redir

const  redir  = require('./index');

【讨论】:

以上是关于TypeError:x 不是 Node.js 中的函数的主要内容,如果未能解决你的问题,请参考以下文章

Node.js | TypeError: [...] 不是函数

Node.js:TypeError:req.end不是一个函数

为啥不和谐的客户端有错误输出:TypeError:node.js中的[CLIENT_MISSING_INTENTS]?

类型错误:不是 NODE JS DIScord Bot 中的函数 [关闭]

为什么我的kafkajs客户端(Node.js / express.js)在获取主题元数据时抛出'TypeError:topic.forEach不是函数?

TypeError:无法读取未定义的属性“获取”(Node.js)