Nodejs 调用rest服务 并返回json 数据 响应无效

Nodejs 调用rest服务 并返回json 数据 响应无效

通过nodejs 发送get请求,服务端响应返回了数据,但是通过res.send 方法返回数据时response无响应,不知道哪位大神能帮忙指点下。 var reqGet = http.request(optionsget, function (resGet) { resGet.on(‘data’, function (d) { if (d && d != ‘null’) { var data = JSON.parse(d); req.session.user = data; //res.json(data); //console.log(JSON.stringify(data)); //res.end(JSON.stringify(data)); //var j = { u: ‘33556’ }; //res.send(j);

                res.send(data);
            }
            else {
            }
            res.end();
        });
    });

5 回复

针对你提到的问题,Node.js 在调用 REST 服务并返回 JSON 数据时遇到响应无效的情况。通常这种问题可能与异步处理有关,或者是在处理请求和响应的生命周期中出现了一些逻辑错误。

以下是一个简化且有效的示例,展示如何使用 Node.js 的 http 模块来调用 REST 服务,并将接收到的数据返回给客户端:

示例代码

首先,确保你的项目已经安装了必要的模块。如果尚未安装 express,可以通过运行 npm install express 来安装它。

const http = require('http');
const express = require('express');
const app = express();

app.get('/getData', (req, res) => {
    const options = {
        hostname: 'api.example.com',
        port: 80,
        path: '/data',
        method: 'GET',
        headers: {
            'Content-Type': 'application/json'
        }
    };

    const reqGet = http.request(options, (resGet) => {
        let data = '';

        resGet.on('data', (chunk) => {
            data += chunk;
        });

        resGet.on('end', () => {
            try {
                const jsonData = JSON.parse(data);
                res.json(jsonData); // 直接返回 JSON 数据
            } catch (error) {
                console.error("Failed to parse JSON:", error);
                res.status(500).send("Internal Server Error");
            }
        });
    });

    reqGet.on('error', (error) => {
        console.error(`Problem with request: ${error.message}`);
        res.status(500).send("Internal Server Error");
    });

    reqGet.end();
});

app.listen(3000, () => {
    console.log('Server is running on port 3000');
});

解释

  1. 引入模块:我们引入了 httpexpress 模块。
  2. 设置路由:定义了一个 /getData 的 GET 路由。
  3. 创建 HTTP 请求:配置了向 REST API 发送 GET 请求的选项。
  4. 监听响应
    • 使用 'data' 事件收集所有从服务器返回的数据片段。
    • 使用 'end' 事件在所有数据都接收完毕后解析 JSON 数据,并通过 res.json 返回给客户端。
  5. 错误处理:如果请求过程中发生错误或解析 JSON 失败,发送一个错误响应。

这样可以确保在正确处理了所有数据之后才返回响应,避免了异步操作中的常见问题。希望这可以帮助你解决问题!


直接res.json 不行 吗

不行,不过问题解决了,是resGet.on(‘end’, function () {});才行;

文档上面关于http.get和http.request的区别写的很清楚的。。。

根据你的描述和提供的代码片段,看起来你正在尝试从一个 REST 服务获取数据,并将该数据返回给客户端。问题可能出在几个地方,比如请求的方式、如何处理响应以及如何正确地返回数据。

首先,你需要确保使用的是 httphttps 模块来发送请求,并且正确处理响应。此外,res.send()res.json() 是 Express.js 中的方法,而不是原生 Node.js 的方法。如果你直接使用原生 http 模块,你需要自己设置响应头并发送响应体。

这里有一个简化的例子,说明如何使用 http 模块从 REST 服务获取数据,并将结果作为 JSON 返回给客户端:

const http = require('http');
const url = require('url');

function makeRequest(urlString, callback) {
    const parsedUrl = new URL(urlString);
    const options = {
        hostname: parsedUrl.hostname,
        port: parsedUrl.port,
        path: parsedUrl.pathname + parsedUrl.search,
        method: 'GET',
        headers: {
            'Content-Type': 'application/json'
        }
    };

    const req = http.request(options, (res) => {
        let data = '';
        res.on('data', (chunk) => {
            data += chunk;
        });

        res.on('end', () => {
            try {
                const jsonData = JSON.parse(data);
                callback(jsonData);
            } catch (error) {
                console.error('Error parsing JSON:', error);
            }
        });
    });

    req.on('error', (error) => {
        console.error('Request failed:', error);
    });

    req.end();
}

// 使用上面的函数来获取数据
makeRequest('http://your-rest-service.com/api/data', (jsonData) => {
    console.log(jsonData);

    // 如果你在 Express.js 环境中,可以这样返回响应
    // res.json(jsonData);
});

在这个例子中,我们定义了一个 makeRequest 函数来发送 GET 请求并处理响应。我们监听 'data' 事件来累积数据,然后在 'end' 事件触发时解析 JSON 并调用回调函数。如果需要在 Express 应用中使用,你可以直接调用 res.json(jsonData) 来返回 JSON 数据。

如果你是在 Express.js 中使用,请确保你的路由处理函数正确接收请求并调用 makeRequest 函数。

回到顶部