使用Node.js获取解析JSON时出现ReferenceError: data未定义错误
错误原因与解决办法
错误原因
这是在Node.js的REPL(交互式命令行)里分段输入链式代码导致的问题:
- REPL是逐行执行代码的,当你输入完
fetch(url)按回车后,这行代码会被立即执行并返回Promise对象,但后续的.then(...)被当成单独一行输入,REPL无法识别它属于之前的Promise链式调用,因此抛出Invalid REPL keyword错误。 - 后续的
my_data = data;和});被单独执行时,data变量根本不存在,自然触发ReferenceError;而});本身是无效语法,也会报错。
另外,代码里的my_data未用let/const声明,会隐式变成全局变量,属于不规范写法。
解决办法
1. 使用REPL多行输入模式
输入代码时,每写完一行不要直接按回车,而是按Shift+Enter换行,把整个链式调用代码一次性输入完成后,再按回车执行:
const fetch = require('node-fetch'); const url = 'https://gist.githubusercontent.com/gcollazo/884a489a50aec7b53765405f40c6fbd1/raw/49d1568c34090587ac82e80612a9c350108b62c5/sample.json'; fetch(url) .then(res => res.json()) .then(data => { let my_data = data; // 加上let声明变量,避免隐式全局变量 console.log(my_data); // 可打印结果验证 });
2. 保存为文件运行(推荐)
把代码写入一个.js文件(比如fetch-json.js),然后在命令行执行node fetch-json.js,这样整个代码会被Node.js一次性解析执行,不会出现REPL逐行执行的问题。
3. 改用async/await写法(更直观)
在REPL里用async函数可以避免链式调用的换行问题,示例如下:
const fetch = require('node-fetch'); const url = 'https://gist.githubusercontent.com/gcollazo/884a489a50aec7b53765405f40c6fbd1/raw/49d1568c34090587ac82e80612a9c350108b62c5/sample.json'; async function getJson() { const res = await fetch(url); const my_data = await res.json(); console.log(my_data); } getJson();
或者用自执行async函数:
const fetch = require('node-fetch'); const url = 'https://gist.githubusercontent.com/gcollazo/884a489a50aec7b53765405f40c6fbd1/raw/49d1568c34090587ac82e80612a9c350108b62c5/sample.json'; (async () => { const res = await fetch(url); const my_data = await res.json(); console.log(my_data); })();
4. 规范变量声明
不管用哪种写法,都要给my_data加上let或const声明,避免隐式全局变量的问题。
内容的提问来源于stack exchange,提问作者aste123
相关产品推荐
相关产品推荐

