我正在学习一篇关于设置Slack机器人的教程,并试图通过将一些函数移到其他文件中来整理代码,使其更具可读性.

在我try 重新安排之前的初始状态是这样的:

app.event('app_home_opened', async ({event, client, context}) => {
  // things happen over 50 lines
})
await app.start()

然后我试着把它重新安排成这样的东西:

app.js

const handleAppHomeOpened = require('./events/app_home_opened.js')
app.event('app_home_opened', handleAppHomeOpened)
await app.start()

events/app_home_opened.js

async function handleEvent({event, client, context}) {
  // things happen
}
module.exports = handleEvent

当我在这个版本中运行app.js时,我得到错误TypeError: app.event(...) is not a function.


如果我按如下方式更新app.js,则它将正确执行:

const handleAppHomeOpened = require('./events/app_home_opened.js')
app.event('app_home_opened', async ({event, client, context})=>{
  handleAppHomeOpened({event, client, context})
})
await app.start()

有没有办法调整第二个函数,使其正常工作,而不是将函数调用包装在匿名函数中的额外步骤?

推荐答案

然后我试着把它重新安排到something like this

您发布的代码没有复制您声称的错误,我打赌您的实际代码是不同的.所以我会做一些侦探工作,并做出预测.让我们从分析您的错误开始:

> a = 1
1
> a()
Uncaught TypeError: a is not a function

错误在于,a不是一个函数.不完全是你的错误的格式.这里的数字1不是函数.到目前一切尚好.但让我们试着更接近你的错误.

> app = {}
{}
> app.event = 1
1
> app.event()
Uncaught TypeError: app.event is not a function

稍微靠近一点,但请注意,我们在错误中遗漏了(...)部分.这里app.event不是一个函数.(这是一个数字).让我们继续前进吧.

> app.event = () => 1
[Function (anonymous)]
> app.event()()
Uncaught TypeError: app.event(...) is not a function

啊哈!此错误的格式正确.这意味着当调用函数app.event时(例如,使用app.event())返回的值不是函数.事实上,我们做到了,app.event()的返回值正好是数字1.

让我们让它返回一个函数

> app.event = () => () => 1
[Function (anonymous)]
> app.event()()
1

太棒了!它起作用了.那么你可能会做什么呢?好的,你有async个,一个意外的异步函数返回一个promise .让我们来演示一下

> app.event = async () => () => 1
[AsyncFunction (anonymous)]
> app.event()()
Uncaught TypeError: app.event(...) is not a function

这可能就是你所做的--不知何故.(修复方法是等待返回函数的promise .)我不能确定,因为您的代码片段不完整,不能代表实际错误.

但这可能是另一件简单得多的事情;

我预测,因为您没有在行尾使用分号,所以您可能意外地调用了如下函数:

app.event('app_home_opened', async ({event, client, context}) => {
  // things happen over 50 lines
})
(somethingInParenthesesHere)

上面是在JavaScript中自动插入分号时的一个著名的歧义.它使它看起来像app.event()(somethingInParenthesesHere),就像你将app.event()的结果作为函数调用,并将somethingInParenthesesHere作为参数传递.

一种常见的"花括号里的东西"是一种生活.例如:

app.event('app_home_opened', async ({event, client, context}) => {
  // things happen over 50 lines
})

(function (){ /* blah-blah-blah */ })();

这样的问题可以通过在正确的位置添加分号来更正.

app.event('app_home_opened', async ({event, client, context}) => {
  // things happen over 50 lines
});   // <-- semicolon is needed in this case.

(function (){ /* blah-blah-blah */ })();

Node.js相关问答推荐

GraphQL MongoDB Mongoose填充字段未获取多个类别

Mongoose:如何在文档中推送到Caped(有限大小,滚动窗口)数组?

如何在Sequelize with Postgres中将m:n关联表ID从整数迁移到UUID?

AWS-ROUTE 53指向S3存储桶,错误是别名目标名称不在目标区域内

向url传递多个参数

TS 后端开发:prismagenerate找不到已安装的@tsed/prisma包

Node fetch 实现似乎与 Deno 和 Bun 不同,导致网站没有返回响应?

eSignature API 的 NodeJS SDK 是否支持数据流?

我应该转译我的 TypeScript 应用程序吗?

如何使用 node.js 将两个或多个 API 请求组合成一个端点并表达

try 在 Heroku 中部署 PRN 应用程序并获得 404

在 NodeJS/ESP32 中通过 WebSocket 发送二进制数据 - 如何识别二进制和文本消息

如何刷新 youtube-data-api v3 的访问令牌

当我使用 uuid 代码意外崩溃,然后工作正常?

适用于 Windows 的 NVM 无法正常工作?

将 myproject/.npmrc 与注册表一起使用

代理(如提琴手)可以与 Node.js 的 ClientRequest 一起使用吗

为什么模块级返回语句在 Node.js 中起作用?

Node.js 中的 Streams3 是什么,它与 Streams2 有何不同?

如何从 Node.js 应用程序Ping?