【问题标题】:Moodle error: SyntaxError Unexpected token m in JSON at position 0Moodle 错误:SyntaxError 位置 0 处 JSON 中的意外标记 m
【发布时间】:2022-01-26 16:11:59
【问题描述】:

我在 Moodle (v3.11) 中遇到了这个错误,想知道是否有人知道修复方法。

我有一个正在与我的团队一起构建的块插件。我们四个人都遇到了同样的错误。

安装后,当我点击 Moodle Dashboard 中的“添加块”按钮时,它会抛出此错误:

SyntaxError
Unexpected token m in JSON at position 0

SyntaxError: Unexpected token m in JSON at position 0
at parse (<anonymous>)
at http://localhost/moodle/lib/javascript.php/1643153825/lib/jquery/jquery-3.5.1.min.js:2:79369
at l (http://localhost/moodle/lib/javascript.php/1643153825/lib/jquery/jquery-3.5.1.min.js:2:79486)
at XMLHttpRequest.<anonymous> (http://localhost/moodle/lib/javascript.php/1643153825/lib/jquery/jquery-3.5.1.min.js:2:82254)

我已将导致错误的代码缩小到一个简单的 echo 调用:

注意:我一直在使用 echo 来临时显示我在块中开发的功能的信息。

示例(在位置 0 处抛出意外的“m”)。

echo 'mod id: ' . $moduleid . "<br>"; 

在探索错误时,“位置 0 处的 JSON 中的意外标记 m”中的 m 始终显示我的代码中第一个 echo 块中的第一个字符,无论我在块中有哪些或多少个 echo 调用。

由于这是我的第一份编码工作,而且我现在只使用 Moodle 和 PHP 大约 3 周,我担心我的 echo 调用可能做错了什么?同时使用“单”和“双”引号时会引发错误。

为什么在 Moodle 3.11 中单击“添加块”时向块插件添加回显会导致语法错误?

【问题讨论】:

  • echo 'mod id: ' . $moduleid . "&lt;br&gt;"; 不会输出 JSON。看php.net/manual/en/function.json-encode.php
  • 我所有的回声呼叫都在做他们应该做的事情,并打印到窗口。作为一名新程序员,我认为它不应该使用 JSON。也许它在错误消息中显示的一件事是调用 JSON?它甚至在我回显“
    ”的行上抛出错误;在页面顶部!

标签: php moodle moodle-api moodle-theme moodle-boost


【解决方案1】:

您的块中的任何函数都不应该直接产生任何输出 - 它们应该只返回可以在页面内适当位置输出的值。

如果您在代码中添加额外的“echo”语句,那么您应该完全预料到您在此处看到的那种问题:

  • “添加块”Javascript 代码向服务器发出回调以进行添加
  • 作为该过程的一部分,将调用块的 get_content() 函数来查看块内是否有任何内容要显示给当前用户(这决定了是否应该为当前用户显示块)李>
  • 然后服务器代码输出 JSON 格式的响应,Javascript 对其进行解析以检查回调是否成功。

如果您向块的函数添加任何额外的输出,那么这将出现在预期 JSON 输出之前的响应中。例如你可能会得到这样的东西:

mod id: 5<br>{"error": false, "response": "...CONTENT..."}

当 Javascript 代码尝试将其解析为 JSON 时,它发现第一个字符是“m”而不是“{”,因此它会因您报告的错误而失败。

如果您想在开发代码时理解/调试代码,您应该安装 xdebug 并使用适当的 IDE(我使用 PHPStorm,但其他 IDE 也可以)设置断点并逐步执行代码 - 这允许您可以直接查看正在发生的事情,而不会弄乱生成的输出。

【讨论】:

  • 谢谢。我们一直在使用 Visual Studio。将不得不为它寻找 xdebug 或类似的东西。
  • 另一个菜鸟开发者问题,如果我进行数据库调用,我可以在控制台中显示块中的数据吗?
  • 如果您有 xdebug 工作,那么您可以通过设置断点并检查分配给它们的变量中的结果来检查 DB 调用的结果。您无法轻松地将结果输出到浏览器中的 javascript 控制台。
猜你喜欢
  • 2017-05-08
  • 1970-01-01
  • 2020-07-02
  • 2021-05-06
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 2017-12-24
  • 2017-07-29
相关资源
最近更新 更多