Node.js调用API GET请求返回undefined问题排查求助
问题排查与修复方案
核心问题原因
- 异步输入读取逻辑错误:Node.js内置
readline模块的行读取为异步事件驱动逻辑,你当前使用同步调用readLine().trim()的方式无法正确拿到输入值,会直接返回undefined - 接口返回字段取值错误:接口返回的书籍信息存储在返回体的
data数组中,你直接从返回根节点result读取bookName、year字段必然为空 - 可选优化点:请求参数未做编码,若输入包含特殊字符会导致请求URL非法;JSON解析未加异常捕获,返回非JSON格式时会直接崩溃
修复代码
1. 输入流读取逻辑封装(以标准Node.js readline模块为例)
const readline = require('readline'); const https = require('https'); // 这里假设ws是你已经实例化的可写流对象 const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); // 封装为异步方法,等待用户输入完成 function readLineAsync() { return new Promise(resolve => { rl.once('line', (input) => { resolve(input.trim()); }); }); }
2. getBooksInfo方法优化
function getBooksInfo(name) { // 对输入参数编码,防止特殊字符导致URL非法 const url = `https://test/books?name=${encodeURIComponent(name)}`; return new Promise(function (resolve, reject) { https.get(url, res => { res.setEncoding("utf8"); let body = ""; res.on("data", data => { body += data; }); res.on("end", () => { try { // 新增异常捕获,防止返回非JSON内容时程序崩溃 const parsedBody = JSON.parse(body); resolve(parsedBody); } catch (e) { reject(e); } }); res.on("error", (e) => { reject(e); }); }); }); }
3. storeInfo方法修正
async function storeInfo() { // 调用异步输入读取方法拿到用户输入 const name = await readLineAsync(); const result = await getBooksInfo(name); // 改为判断data数组是否为空 const isEmpty = !result.data || !result.data.length; if (isEmpty) { ws.write('We don\'t have this book in our database'); } else { // 从data数组中取第一条书籍信息 const targetBook = result.data[0]; ws.write(`Book Name: ${targetBook.bookName}`); ws.write(`Year: ${targetBook.year}\n`); } // 输入流使用完成后关闭 rl.close(); }
内容的提问来源于stack exchange,提问作者reactjs
相关产品推荐
相关产品推荐

