如何从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
相关产品推荐
相关产品推荐

