如何修复我的代码以使其发送 json 数据作为对邮递员 GET 请求的响应?
Posted
技术标签:
【中文标题】如何修复我的代码以使其发送 json 数据作为对邮递员 GET 请求的响应?【英文标题】:How can I fix my code to make it send the json data as a response to postman's GET requests? 【发布时间】:2021-12-20 18:46:30 【问题描述】:我通过代码收到的数据通过console.log
输出到cmd,但我似乎无法弄清楚如何使相同的数据可用于邮递员的GET
请求。谢谢
const express = require('express');
const app = express();
const PORT = 5000;
const apicall = require('./apicall');
const request = require('request');
app.get('/', (req, res) =>
res.send("Hello world!")
);
app.get('/getinfo', (req, res, body) =>
const getToken = (url, callback) =>
const options =
url: process.env.GET_TOKEN,
json: true,
body:
client_id: process.env.CLIENT_ID,
client_secret: process.env.CLIENT_SECRET,
grant_type: 'client_credentials'
;
request.post(options, (err, res, body) =>
if(err)
return console.log(err)
console.log(`Status: $res.statusCode`)
console.log(body);
callback(res);
);
var AT = '';
var info = '';
getToken(process.env.GET_TOKEN, (res) =>
AT = res.body.access_token;
return AT;
);
const getGames = (url, accessToken, callback) =>
const gameOptions =
url: process.env.GET_GAMES,
method: 'GET',
headers:
'Client-ID': process.env.CLIENT_ID,
'Authorization': 'Bearer ' + accessToken
;
request.get(gameOptions, (err, res, body) =>
if(err)
return console.log(err);
let x = '';
console.log(`Status: $res.statusCode`);
console.log(JSON.parse(body));
//res.send(parsed);
//req.body.getinfo = JSON.parse(body);
)
setTimeout(() =>
getGames(process.env.GET_GAMES, AT, (response) =>
);
, 1000);
//res.send(JSON.parse(body));
);
app.listen(PORT, () =>
console.log(`Example app listening on port $PORT`);
);
【问题讨论】:
您发布的 javascript 代码存在语法错误。请纠正他们。 @HeikoTheißen 抱歉,已更正 【参考方案1】:您在request.get
的回调中使用res.send
。但在这种情况下,res
是来自您调用的 API 的 incoming 响应,而不是您的应用创建的 outgoing 响应。只有 outgoing 响应包含 send
方法。
要将两者分开,请使用不同的名称:
app.get("/getinfo", function(req, res)
request.get(..., function(err, incoming_res, body)
res.json(JSON.parse(body));
);
);
【讨论】:
好的,到目前为止,我想我明白你在说什么。那么如何通过 GET 请求将我从 api 得到的响应发送给邮递员呢? 查看我编辑的答案。【参考方案2】:res.send
是 express 的一部分。如果失败的 res.send 在 request.get
中,那是因为它不是 express
的一部分。
request
的文档中说响应参数将是 http.IncomingMessage 的一个实例。这应该意味着您可以简单地使用res.end
编辑:
@HeikoTheißen 是对的。没有res.end
。
但这可以用不同的方式处理。如果我们可以将 get 请求封装在一个 Promise 中,那么我们就可以使用 get 请求中需要发送的任何内容来解析该 Promise。
一个例子:
const result = await new Promise((resolve) =>
request(gameOptions, function (error, response, body)
resolve (status : 'A Ok!') // <--- send response here
console.log ("result is ", result) // <-- Object status : 'A Ok!'
【讨论】:
大家好,我已经尝试了这两种解决方案,但出现错误。首先,状态是将“未定义”记录到 cmd,然后:“JSON 位置 0 中的意外令牌 u” 我可能只是写错了,不确定。 如果request.get
返回body = undefined
,则不能将其解析为 JSON。我在回答中给出的代码只是一个骨架,必须通过额外的检查来丰富。
Zephyr,http.IncomingMessage
没有方法 end
。由于它是传入的,因此您只能读取它,但不能写入(就像end
方法一样)。
我正在查看代码,试图找出我得到的当前语法错误,即使在重置我的代码后也似乎存在。之后,我将不得不研究如何填写您提出的框架代码。【参考方案3】:
您只需像.pipe(res)
那样将其传递给响应
const express = require('express');
const app = express();
const PORT = 5000;
const apicall = require('./apicall');
const request = require('request');
app.get('/', (req, res) =>
res.send("Hello world!")
);
app.get('/ne2', (req, res) =>
//res.send('This is the new endpoint');
apicall.getCall;
);
app.get('/getinfo', (req, res, body) =>
const getToken = (url, callback) =>
const options =
url: process.env.GET_TOKEN,
json: true,
body:
client_id: process.env.CLIENT_ID,
client_secret: process.env.CLIENT_SECRET,
grant_type: 'client_credentials'
;
request.post(options, (err, res, body) =>
if(err)
return console.log(err)
console.log(`Status: $res.statusCode`)
console.log(body);
callback(res);
);
var AT = '';
var info = '';
getToken(process.env.GET_TOKEN, (res) =>
AT = res.body.access_token;
return AT;
);
const getGames = (url, accessToken, callback) =>
const gameOptions =
url: process.env.GET_GAMES,
method: 'GET',
headers:
'Client-ID': process.env.CLIENT_ID,
'Authorization': 'Bearer ' + accessToken
;
request.get(gameOptions, (err, res, body) =>
if(err)
return console.log(err);
let x = '';
console.log(`Status: $res.statusCode`);
//console.log(JSON.parse(body));
info = JSON.parse(body);
console.log(info);
//res.send(parsed);
//req.body.getinfo = JSON.parse(body);
).pipe(res);
setTimeout(() =>
getGames(process.env.GET_GAMES, AT, (response) =>
);
, 1000);
//res.send(info);
);
app.listen(PORT, () =>
console.log(`Example app listening on port $PORT`);
);
【讨论】:
以上是关于如何修复我的代码以使其发送 json 数据作为对邮递员 GET 请求的响应?的主要内容,如果未能解决你的问题,请参考以下文章
如何更新 cupy/CUDA 以使其再次工作并修复我的 conda 环境?