如何修复我的代码以使其发送 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 请求的响应?的主要内容,如果未能解决你的问题,请参考以下文章

如何修复无效的随机字符串以使其 JSON 有效

如何更新 cupy/CUDA 以使其再次工作并修复我的 conda 环境?

如何修复我的 keycloak 上的 cors 错误以使其正常工作?

我如何修复此代码以使其修剪尾随零和小数点

如何在没有双引号的情况下修复 JSON 键值?

将递增数字添加到 JSON 对象字符串以使其唯一