我的网站上的 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 不是一个函数而是一个承诺,因为你没有awaitimportimport 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.logging 来回答 然后你会发现它是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 登录无效。为啥?的主要内容,如果未能解决你的问题,请参考以下文章

Discord Oauth2 收到“无效客户端”错误

在我的网站上设置 Discord oauth2 登录(使用 PHP?)

为啥我的 twitter oauth 访问令牌无效/过期

为啥我的嵌入看起来像 Discord.py 上的代码?

为啥我的贝宝 ipn 验证总是返回无效?

Discord OAuth2 冻结