我的网站上的 Discord 登录无效。为啥?
Posted
技术标签:
【中文标题】我的网站上的 Discord 登录无效。为啥?【英文标题】:Discord login on my website is not working. Why?我的网站上的 Discord 登录无效。为什么? 【发布时间】:2021-11-22 21:23:34 【问题描述】:我想在网站上实现 Discord 登录。但我有几个问题。当我在终端中使用node oauth.js
启动应用程序时,没有弹出错误。但是,当我在 Discord 网站上点击授权时,弹出以下错误:
TypeError: fetch is not a function
at ...\oauth.js:49:5
at Layer.handle [as handle_request] (...\node_modules\express\lib\router\layer.js:95:5)
at next (...\node_modules\express\lib\router\route.js:137:13)
at Route.dispatch (...\node_modules\express\lib\router\route.js:112:3)
at Layer.handle [as handle_request] (...\node_modules\express\lib\router\layer.js:95:5)
at ...\node_modules\express\lib\router\index.js:281:22
at Function.process_params (...\node_modules\express\lib\router\index.js:335:12)
at next (...\node_modules\express\lib\router\index.js:275:10)
at ...\node_modules\body-parser\lib\read.js:130:5
at invokeCallback (...\node_modules\raw-body\index.js:224:16)
我的代码中找不到错误...与fetch
有关
My code
有什么想法吗?
【问题讨论】:
fetch
不是一个函数而是一个承诺,因为你没有await
和import
。 import
as 函数是异步的(不像 import
statement 用作 import fetch from 'node-fetch'
)。但是由于您在其他任何地方都使用 CommonJS require
,因此您可能应该将其更改为 require('node-fetch')
。
顺便说一句 - 对未来的建议:在逻辑上尝试找出正在发生的事情的原因,逐步将您期望的事情与实际发生的事情进行比较,直到您找到了差异的根源。在这种情况下,我会期待像Why does import('node-fetch') return a promise?
这样的问题而不是Why is my Discord login not working?
- 如果错误显示fetch is not a function
,那么下一个合乎逻辑的步骤是问自己“好的,那么是 吗?” - 可以通过在调试器中查看或console.log
ging 来回答
然后你会发现它是Promise
。由于 fetch
仅来自您代码中的一个位置 - const fetch = import('node-fetch')
- 这意味着 import('node-fetch')
在您期望一个函数时返回了一个承诺。搜索它可能已经找到了正确的答案(import
函数是异步的,语句不是),但如果不是,that 将是要问的问题。 (此外,它可能看起来“不合适”,其他所有东西都是 require
并且可以工作,但是这个是 import
并且没有,所以你也可以尝试在那里使用 require
并且会看到它工作。)
另外一个建议:不要写那么多cmets。例如,将// Send the username with a status code 200.
评论到res.status(200).send(response.data.username)
或// Define "data"
到data =
是没有意义的——您的代码已经说过,没有理由将同一件事传达两次!这只是阅读时的“噪音”,并且是在更改时与实际代码保持同步的负担(例如,我看到您在实际创建 URLSearchParams
对象时写了有关创建 FormData
的内容)。注释的存在是为了传达实际代码缺少的含义。评论why,而不是what。
还有一件事:我不明白您为什么要使用两个不同的请求库。要么使用axios
或 node-fetch
,两者都用没意义...
【参考方案1】:
从小提琴的角度来看,除了您格式化 fetch
导入的方式之外,我看不出任何问题。
const fetch = require('node-fetch');
尝试类似的方法而不是导入它。
【讨论】:
我已经尝试过了,但随后弹出此错误: internal/modules/cjs/loader.js:1089 throw new ERR_REQUIRE_ESM(filename, parentPath, packageJsonPath); ^ 错误 [ERR_REQUIRE_ESM]: Must use import to load ES Module: C:\Users\Dominik\Documents\Development\Websites\Norvex\ucp.norvex.eu\node_modules\node-fetch\src\index.js require() of不支持 ES 模块。 所以我认为这行不通 来自文档“node-fetch 是一个 ESM-only 模块 - 你不能用 require 导入它。我们建议你继续使用 CommonJS 构建的 v2,除非你自己使用 ESM。我们将继续为它发布关键的错误修复。”因此,您需要降级到 v2 或按照 docs 中的建议异步导入 如何降级? 运行 npm i node-fetch@2.6.5以上是关于我的网站上的 Discord 登录无效。为啥?的主要内容,如果未能解决你的问题,请参考以下文章