You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Node.JS LMS调用Moodle Rest-API获取课程数据?

Node.js 调用Moodle API 实操方案

先搞定Moodle端的前置配置

  • 启用Web服务:登录Moodle后台,进入「站点管理」→「高级功能」,开启「Web服务」
  • 创建服务:「站点管理」→「插件」→「Web服务」→「外部服务」,新建服务(比如命名为course_api),勾选「启用」,并添加core_course_get_contents权限
  • 获取访问令牌:
    • 方式1:让用户在个人页面→「安全」→「生成令牌」,选择刚才创建的服务生成token
    • 方式2:调用Moodle的token接口生成(适合自动化场景):
      // 示例:POST请求获取token
      const tokenResponse = await fetch('https://你的Moodle域名/webservice/token.php', {
        method: 'POST',
        headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
        body: new URLSearchParams({
          username: '你的Moodle用户名',
          password: '你的Moodle密码',
          service: 'course_api' // 对应你创建的服务名称
        })
      });
      const tokenData = await tokenResponse.json();
      const token = tokenData.token;
      

Node.js 端调用示例(用node-fetch)

直接在Node.js服务端发起请求,无需代理绕CORS,代码如下:

const fetch = require('node-fetch');

async function getCourseContents() {
  const moodleDomain = 'https://你的Moodle域名';
  const token = '你的访问令牌';
  const courseId = 1;

  try {
    const response = await fetch(`${moodleDomain}/webservice/rest/server.php`, {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      // 开发环境如果是自签名证书,添加此选项跳过验证(生产环境禁用,建议用合法SSL证书)
      agent: new (require('https').Agent)({ rejectUnauthorized: false }),
      body: JSON.stringify({
        wstoken: token,
        wsfunction: 'core_course_get_contents',
        moodlewsrestformat: 'json',
        courseid: courseId
      })
    });

    // 先检查响应状态
    if (!response.ok) {
      throw new Error(`请求失败:${response.statusText}`);
    }

    const courseData = await response.json();
    console.log('课程内容:', courseData);
  } catch (error) {
    console.error('调用出错:', error.message);
  }
}

getCourseContents();

常见问题解决

  • 证书错误:开发环境临时用rejectUnauthorized: false跳过,生产环境必须配置受信任的SSL证书,或者在Node.js中指定CA证书路径
  • JSON格式错误:确保请求头Content-Type是application/json,请求body是严格的JSON格式(比如字符串用双引号,参数名正确)
  • 权限不足:检查Moodle服务是否添加了core_course_get_contents权限,以及生成token的用户是否有该课程的访问权限
  • CORS问题:直接在Node.js服务端发起请求,不要从浏览器客户端调用,彻底避免CORS限制

内容的提问来源于stack exchange,提问作者Johnathan Stowers

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 08:07:20