请问下,NAE 是不是不能使用 Nodejs 的 http.request() 呢?

请问下,NAE 是不是不能使用 Nodejs 的 http.request() 呢?

nae 上使用这个代码,发现有问题,页面直接挂了 exports.getTitleFrom = function getTitleFrom(reqqq,response){ var title; var req = http.request(‘http://www.baidu.com’, function(res){ res.on(‘data’, function (chunk) { title+=chunk.toString(); response.send(title); }); }); req.on(‘error’, function(e) { console.log('problem with request: ’ + e.message); }); req.end(); }


2 回复

根据你提供的代码和描述,NAE(可能是某种特定的运行环境或平台)确实可能对某些网络请求行为有特定限制。http.request() 方法在 Node.js 中用于发起 HTTP 请求,但在某些受限环境中(如某些云服务、沙箱环境等),可能会因为安全策略或资源限制而无法正常工作。

示例代码分析

exports.getTitleFrom = function getTitleFrom(reqqq, response) {
    var title = ''; // 初始化 title 为一个空字符串
    var req = http.request('http://www.baidu.com', function(res) {
        res.on('data', function(chunk) {
            title += chunk.toString(); // 将接收到的数据片段拼接到 title 中
            response.send(title); // 直接发送接收到的数据片段
        });
    });

    req.on('error', function(e) {
        console.log('problem with request: ' + e.message);
    });

    req.end();
};

问题分析

  1. 初始化问题

    • title 变量没有被初始化为空字符串。虽然在后续代码中进行了初始化,但最好一开始就将其设为空字符串以避免潜在的错误。
  2. 数据处理

    • 在接收到数据时,将每个数据片段拼接到 title 中,然后立即发送给客户端。这会导致在数据未完全接收前就发送部分数据给客户端,从而可能导致不完整或乱序的数据。
  3. NAE 环境限制

    • 如果 NAE 平台对网络请求有严格的限制,比如超时时间、并发连接数等,那么 http.request() 可能会遇到问题。此外,某些环境可能不允许直接进行外部网络请求。

解决方案

为了确保代码在 NAE 平台上能够正常工作,可以考虑以下几点:

  1. 初始化变量

    • 确保所有变量都正确初始化。
  2. 数据累积

    • 等待所有数据片段接收完毕后再发送给客户端。
  3. 错误处理

    • 更加详细的错误处理,以便更好地调试问题。

修改后的代码示例

const http = require('http');

exports.getTitleFrom = function getTitleFrom(reqqq, response) {
    var title = ''; // 初始化 title 为一个空字符串

    var req = http.request('http://www.baidu.com', function(res) {
        res.setEncoding('utf8'); // 设置编码为 utf8
        let data = '';

        res.on('data', function(chunk) {
            data += chunk; // 累积数据片段
        });

        res.on('end', function() {
            title = data; // 数据接收完毕后,赋值给 title
            response.send(title); // 发送完整数据
        });
    });

    req.on('error', function(e) {
        console.log('problem with request: ' + e.message);
        response.status(500).send('Request failed');
    });

    req.end();
};

在这个修改后的版本中,我们确保数据在发送之前已经完全接收并累积到 data 变量中。同时,我们在数据接收完毕后才发送数据给客户端,这样可以避免发送不完整或乱序的数据。


根据你的描述,在NAE(可能是某种特定环境或平台)上使用http.request()遇到问题。实际上,http.request()是Node.js的标准库中的一个方法,理论上可以在任何支持Node.js的环境中使用。

如果在NAE平台上出现问题,可能是由于以下几个原因:

  1. NAE平台可能存在一些限制或者安全策略,阻止某些网络请求。
  2. 代码中存在逻辑错误,比如未初始化title变量就进行字符串拼接。
  3. 代码缺少必要的依赖或模块导入。

下面是一个改进后的示例代码:

const http = require('http');

exports.getTitleFrom = functiongetTitleFrom(reqqq, response) {
    let title = ''; // 初始化变量
    const options = {
        hostname: 'www.baidu.com',
        port: 80,
        path: '/',
        method: 'GET'
    };

    const req = http.request(options, (res) => {
        res.setEncoding('utf8');
        res.on('data', (chunk) => {
            title += chunk;
        });
        res.on('end', () => {
            response.send(title);
        });
    });

    req.on('error', (e) => {
        console.error(`problem with request: ${e.message}`);
        response.send("Request failed");
    });

    req.end();
};

关键点:

  • 初始化变量title,避免未定义的错误。
  • 使用setEncoding('utf8')来确保数据以UTF-8格式接收。
  • 添加res.on('end', ...)事件处理程序,确保在所有数据接收完毕后发送响应。
  • 在错误处理中,给客户端返回更友好的错误信息。

如果你仍然遇到问题,请检查NAE平台的文档或配置,确认是否允许外部HTTP请求,或者是否有其他安全策略影响。

回到顶部