节点 - 调用 ExpressJS 路由,并需要对其中的 API 执行 GET 请求
Node - Making a call to an ExpressJS route, and need to do a GET request to an API in it
我正在为一个项目制作加密货币仪表板,我对 Node 和 Express 完全陌生。这是我目前拥有的
app.get('/search', function(req,res){
res.writeHead(200, {'Content-Type': 'text/html'});
res.write(req.url);
data = []
var options = {
"method": "GET",
"hostname": "rest.coinapi.io",
"path": "/v1/assets",
"headers": {'X-CoinAPI-Key': 'MY_API_KEY_HERE'}
};
const request = https.request(options, (data, response) => {
response.on('data', d => {
data.push(d);
})
});
console.log(data);
request.end();
res.end();
})
这个想法在我的前端,我有一个按钮,单击该按钮后,将向 CoinAPI api 发出请求,获取所有报告的资产和当前值。我不太确定我应该如何将该响应数据作为响应发送回我的前端。因此,我尝试从 https.request
行返回的 JSON 中提取响应数据。正如您在代码顶部看到的那样,我有一个数据数组 data = []
。
我最初的请求设置如下:
const request = https.request(options, response => {
但是当我尝试将 d
推送到 data
时,我在控制台记录并且数据数组为空。这是有道理的,data
数组超出了请求函数的范围,因此数据不会得到更新。但是当我试图将 data
传递给函数时,我出错了。
基本上我希望能够在向 CoinAPI 发出请求后将 JSON 数据发送回我的前端。如果我在 https.request
回调中执行 process.stdout.write(d)
,我确实会看到返回的硬币 api 数据。我只是不知道如何将它作为响应的一部分发送到前端。
要将 JSON 数据作为响应发送回客户端,您需要做的就是:
return res.json(data);
就这么简单。 :)
问题:
(data, response)
的使用不正确。第一个也是唯一的参数是 response
所以它应该是 (response)
.
on('data')
事件接收缓冲数据。将它连接到最终字符串是标准用法,而不是附加数组。
您缺少一个 on('end')
,您应该使用它来输出最终数据或进行任何处理。
使用 res.write
发送 text/html
内容类型和一些您不需要的内容,如果目标是输出 JSON前端可以解析和使用。
缺少 API 调用的错误处理程序。
完成更新代码:
app.get('/search', function(req,res){
let str = '';
const options = {
"method": "GET",
"hostname": "rest.coinapi.io",
"path": "/v1/assets",
"headers": {'X-CoinAPI-Key': 'MY_API_KEY_HERE'}
};
const request = https.request(options, (response) => {
response.on('data', d => {
str += d;
});
response.on('end', () => {
try {
let obj = JSON.parse(str);
// do any manipulation here
res.json(obj);
} catch(e){
console.log(e);
res.status(500).json({ message: 'Something went wrong - parse error' });
}
});
});
request.end();
request.on('error', (e) => {
console.log(e);
res.status(500).json({ message: 'Something went wrong - req error' });
});
});
我添加了一个 JSON.parse()
来展示如果您想在将数据发送到前端之前对数据进行一些操作,您将如何处理。如果您只是想 return 硬币的确切响应 API 然后使用 end
事件,例如:
response.on('end', () => {
res.json(str);
});
我正在为一个项目制作加密货币仪表板,我对 Node 和 Express 完全陌生。这是我目前拥有的
app.get('/search', function(req,res){
res.writeHead(200, {'Content-Type': 'text/html'});
res.write(req.url);
data = []
var options = {
"method": "GET",
"hostname": "rest.coinapi.io",
"path": "/v1/assets",
"headers": {'X-CoinAPI-Key': 'MY_API_KEY_HERE'}
};
const request = https.request(options, (data, response) => {
response.on('data', d => {
data.push(d);
})
});
console.log(data);
request.end();
res.end();
})
这个想法在我的前端,我有一个按钮,单击该按钮后,将向 CoinAPI api 发出请求,获取所有报告的资产和当前值。我不太确定我应该如何将该响应数据作为响应发送回我的前端。因此,我尝试从 https.request
行返回的 JSON 中提取响应数据。正如您在代码顶部看到的那样,我有一个数据数组 data = []
。
我最初的请求设置如下:
const request = https.request(options, response => {
但是当我尝试将 d
推送到 data
时,我在控制台记录并且数据数组为空。这是有道理的,data
数组超出了请求函数的范围,因此数据不会得到更新。但是当我试图将 data
传递给函数时,我出错了。
基本上我希望能够在向 CoinAPI 发出请求后将 JSON 数据发送回我的前端。如果我在 https.request
回调中执行 process.stdout.write(d)
,我确实会看到返回的硬币 api 数据。我只是不知道如何将它作为响应的一部分发送到前端。
要将 JSON 数据作为响应发送回客户端,您需要做的就是:
return res.json(data);
就这么简单。 :)
问题:
(data, response)
的使用不正确。第一个也是唯一的参数是response
所以它应该是(response)
.on('data')
事件接收缓冲数据。将它连接到最终字符串是标准用法,而不是附加数组。您缺少一个
on('end')
,您应该使用它来输出最终数据或进行任何处理。使用
res.write
发送text/html
内容类型和一些您不需要的内容,如果目标是输出 JSON前端可以解析和使用。缺少 API 调用的错误处理程序。
完成更新代码:
app.get('/search', function(req,res){
let str = '';
const options = {
"method": "GET",
"hostname": "rest.coinapi.io",
"path": "/v1/assets",
"headers": {'X-CoinAPI-Key': 'MY_API_KEY_HERE'}
};
const request = https.request(options, (response) => {
response.on('data', d => {
str += d;
});
response.on('end', () => {
try {
let obj = JSON.parse(str);
// do any manipulation here
res.json(obj);
} catch(e){
console.log(e);
res.status(500).json({ message: 'Something went wrong - parse error' });
}
});
});
request.end();
request.on('error', (e) => {
console.log(e);
res.status(500).json({ message: 'Something went wrong - req error' });
});
});
我添加了一个 JSON.parse()
来展示如果您想在将数据发送到前端之前对数据进行一些操作,您将如何处理。如果您只是想 return 硬币的确切响应 API 然后使用 end
事件,例如:
response.on('end', () => {
res.json(str);
});