大家进来看看帮帮忙,关于Nodejs的问题

大家进来看看帮帮忙,关于Nodejs的问题

/** 主函数*/
function main(a_route,a_handle) {

function onRequest(a_req, a_res) {
	
	a_res.writeHead(200, {'Content-Type': 'text/plain'}); 
	
	a_req.setEncoding('utf8'); 
	
	var t_str=urllib.parse(a_req.url,true).query.json;//接收字符串
	
	/********************/
	console.log("1url:\n"+a_req.url);
	
	console.log("data:\n"+t_str);
	
	/********************/
	
	var t_obj=JSON.parse(t_str);//将字符串转换成json
	
	a_route(a_handle,t_obj.interfaceid,t_obj,a_res);
	
	a_res.end();

}
http.createServer(onRequest).listen(port);

}

写了以上的代码,用浏览器访问http://192.168.0.152:8888/?json={“interfaceid”:“0x1001”,“mac”:“cat”,“gameid”:“23”} 是可以正确解析和使用的, 用C++的编写了一个client端进行访问的时候以上代码报错,经过打印发现时URL为空,找了好久找不是哪里写的问题,client可以跟定是发送了东西的。请高手指点下


7 回复

回答内容

你好!根据你提供的代码和描述,问题可能出在客户端发送请求的方式上。在使用C++客户端发送HTTP请求时,需要确保请求格式正确,并且包含了必要的头部信息。

以下是你的代码片段,我稍作修改以更好地解释和处理可能出现的问题:

// 引入必要的模块
const http = require('http');
const url = require('url');

/** 主函数 */
function main(a_route, a_handle, port) {
    function onRequest(a_req, a_res) {
        // 设置响应头
        a_res.writeHead(200, {'Content-Type': 'text/plain'});
        
        // 解码请求体
        let t_str = '';
        a_req.on('data', (chunk) => {
            t_str += chunk;
        });
        a_req.on('end', () => {
            try {
                // 将请求体转换为JSON对象
                const t_obj = JSON.parse(decodeURIComponent(t_str));
                
                // 打印日志
                console.log("URL:\n" + a_req.url);
                console.log("Data:\n" + t_str);

                // 调用路由处理函数
                a_route(a_handle, t_obj.interfaceid, t_obj, a_res);
            } catch (error) {
                // 如果解析失败,返回错误信息
                a_res.writeHead(400, {'Content-Type': 'text/plain'});
                a_res.end('Invalid JSON data');
            }
        });

        a_res.end();
    }

    // 创建HTTP服务器并监听指定端口
    http.createServer(onRequest).listen(port, () => {
        console.log(`Server running at http://192.168.0.152:${port}/`);
    });
}

// 示例路由处理函数
function route(handle, interfaceId, data, response) {
    if (handle[interfaceId]) {
        handle[interfaceId](data, response);
    } else {
        response.writeHead(404, {'Content-Type': 'text/plain'});
        response.end('Not Found');
    }
}

// 示例处理函数
const handlers = {
    '0x1001': (data, response) => {
        response.end(`Received data: ${JSON.stringify(data)}`);
    }
};

// 启动服务器
main(route, handlers, 8888);

关键点解释

  1. 数据处理

    • 使用 a_req.on('data', ...)a_req.on('end', ...) 来处理请求体,确保接收到完整的数据。
    • 使用 decodeURIComponent 对请求体进行解码,因为C++发送的请求体可能包含URL编码。
  2. 错误处理

    • 使用 try-catch 块来捕获JSON解析错误,如果解析失败,则返回错误信息。
  3. 日志打印

    • 打印请求的URL和数据,以便调试。

C++ 客户端示例

确保C++客户端发送的请求格式正确。以下是一个简单的C++客户端示例,使用 libcurl 发送HTTP请求:

#include <iostream>
#include <string>
#include <curl/curl.h>

int main() {
    CURL *curl;
    CURLcode res;

    curl_global_init(CURL_GLOBAL_DEFAULT);
    curl = curl_easy_init();

    if(curl) {
        std::string post_fields = "json={\"interfaceid\":\"0x1001\",\"mac\":\"cat\",\"gameid\":\"23\"}";

        curl_easy_setopt(curl, CURLOPT_URL, "http://192.168.0.152:8888/");
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, post_fields.c_str());

        // 执行请求
        res = curl_easy_perform(curl);

        if(res != CURLE_OK)
            std::cerr << "curl_easy_perform() failed: " << curl_easy_strerror(res) << std::endl;

        // 清理
        curl_easy_cleanup(curl);
    }

    curl_global_cleanup();
    return 0;
}

希望这些信息能帮助你解决问题!如果还有其他疑问,请随时提问。


浏览器访问时会对url进行urlencode,你用chrome浏览器。看network,看看实际请求的样子。

开发者工具里面的network tab页

不太明白~

比较好奇。我觉得 c++服务端+js客户端的情况比js服务端+c++客户端的情况多很多。你的技术选型是咋样的?

从你的描述来看,问题可能出在C++客户端发送请求的方式上,而不是Node.js服务器端的代码。Node.js代码本身看起来没有明显的问题,它能够正确处理GET请求中的查询字符串。

示例代码

以下是完整的Node.js代码示例:

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

// 模拟路由处理函数
function route(handle, interfaceId, obj, res) {
    console.log(`Route for ${interfaceId}`);
    res.write(`Received request for interfaceId: ${interfaceId}\n`);
    res.end(JSON.stringify(obj));
}

function main(port, handle) {
    const server = http.createServer((req, res) => {
        req.setEncoding('utf8');

        // 解析URL中的查询字符串
        const parsedUrl = url.parse(req.url, true);
        const t_str = JSON.stringify(parsedUrl.query);

        console.log("1url:\n" + req.url);
        console.log("data:\n" + t_str);

        // 解析为JSON对象
        const t_obj = parsedUrl.query;

        // 调用路由处理函数
        route(handle, t_obj.interfaceid, t_obj, res);

        res.end();
    });

    server.listen(port, () => {
        console.log(`Server is listening on port ${port}`);
    });
}

// 示例调用
main(8888, {});

C++客户端示例

假设你使用的是libcurl库来发送HTTP请求,以下是一个简单的C++客户端示例:

#include <iostream>
#include <string>
#include <curl/curl.h>

int main() {
    CURL *curl;
    CURLcode res;

    curl_global_init(CURL_GLOBAL_DEFAULT);
    curl = curl_easy_init();

    if (curl) {
        std::string url = "http://192.168.0.152:8888/?json={\"interfaceid\":\"0x1001\",\"mac\":\"cat\",\"gameid\":\"23\"}";

        curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
        curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);

        res = curl_easy_perform(curl);

        if (res != CURLE_OK)
            std::cerr << "curl_easy_perform() failed: " << curl_easy_strerror(res) << std::endl;

        curl_easy_cleanup(curl);
    }

    curl_global_cleanup();
    return 0;
}

可能的问题

  1. URL编码:确保URL中的特殊字符被正确编码。
  2. C++ 客户端设置:检查是否设置了正确的Content-TypeAccept头。
  3. 错误处理:添加错误处理机制,以确保在网络请求过程中捕获到任何潜在的错误。

如果你已经确认了上述几个方面都没有问题,那么请再次检查C++客户端发送的数据格式和结构是否与预期一致。

回到顶部