使用Node.js获取请求时出现嵌套HTTP错误

时间:2017-04-14 19:46:43

标签: node.js http

我遇到了问题,在解决这些问题时我觉得不够深入。

一,我对Node的理解非常新/不成熟,我对http的理解并不是最强的。

所以在这里向社区寻求一些有希望的帮助。

我已经审查了我的代码,首先通过使用静态类型的对象数组来抽象它的意图,并在浏览器端运行它以确保所有代码都按预期工作(缺少http.get请求)。

我已经将相同的代码移动到节点服务器端,并使用我在本地使用的相同抽象数据集成功运行它,并且一切正常(主要端口3030实例)。

然后我继续介绍一个http.get,它在一个以上的方面有点复杂。

解释

我正在做的一切都发生在我的本地机器上,用于测试/非生产状态开发。

MyServerSetup

在这种情况下,我最终在端口3030上从本地计算机执行http.get请求,并在端口3000上调用另一个节点实例(在单独的cmd.exe实例上运行)。

我已经使用浏览器自行测试了3000,并且它按预期工作:

我启动chrome,转到http://:3000 / bend / 1,然后返回我为其设置的内容(它在URL中提供的最后一个值上运行SQL select语句,并返回一个JSON .stringify(obj)返回浏览器 - 见下图。

Proof_Of_3000_Working

然后我将浏览器指向http://:3030并获取:

Server Started on Port 3030...
TypeError: listener must be a function
    at TypeError (native)
    at ClientRequest.once (events.js:190:11)
    at new ClientRequest (_http_client.js:93:10)
    at Object.exports.request (http.js:49:10)
    at Object.exports.get (http.js:53:21)
    at getBendAndTypeByBend (<<MyPort3030Root>>\program.js:26:9)
    at p_processBends (<<MyPort3030Root>>\program.js:58:14)
    at doAll (<<MyPort3030Root>>\program.js:74:3)
    at <<MyPort3030Root>>\program.js:82:2
    at Layer.handle [as handle_request] (<<MyPort3030Root>>\node_modules\express\lib\router\layer.js:95:5)

我很乐意展示代码,但我不确定哪个部分真的需要解决问题,因为当没有HTTP.GET请求时,每个部分都可以自行运行。

我只是不知道现在哪种方式,我希望这里有人可以帮助我了解从哪里开始理解问题,但最终还是如何解决问题。

我知道这可能会有很多问题,但我真的感到困惑于此,因为在我将它们连接在一起之前,事情似乎正在发挥作用。

以下是从PORT调用的可疑代码段:3030

http = require('http');
fs = require('fs');
async = require('async');
q = require('q');
express = require('express');

app = express();

bends = [
    {"bend" : "1", "type" : ""},
    {"bend" : "2", "type" : ""},
    {"bend" : "7", "type" : ""},
    {"bend" : "14", "type" : ""},
    {"bend" : "33", "type" : ""},
    {"bend" : "48", "type" : ""},
    {"bend" : "73", "type" : ""},
    {"bend" : "82", "type" : ""}
];

function getBendAndTypeByBend(bendStr) {
  result = {"bend" : "", "type" : "", "status" : "false"};
  for (var i=0;i<bends.length;i++) {
      http.get('http://localhost:3000/bend/'+bendStr, 'utf-8', function(err, res) {
        if (err) {
            console.log(err);
        }
        res.on('end', function(err, res1) {
            result.bend = bendStr;
            result.type = JSON.parse(res).row;
            if(i == bends.length-1) {
                result.status = "true";
                return result;
            } else {
                result.status = "false";
            }
        })
      });*/
  }
}

function p_initTables() {
  bt1 = bends.slice();//(b)end(t)able1
  return bt1;
}

function p_processBends(btArr) {
    localbt = btArr.slice();
    //console.log(localbt);
    newbt = [];
    for(var i=0;i<localbt.length;i++){
        newbt.push(
            {
                "bend" : localbt[i].bend,
                "type" : getBendAndTypeByBend(localbt[i].bend).type
            }
        );
    }
    return newbt;
}

function p_renderBendTableToUser(bt) {
    for(var i=0;i<bt.length;i++) {
        console.log("BEND: "+bt[i].bend + " | TYPE: "+bt[i].type+"\n");
    }
    return console.log("\ndone");
}

function doAll() { 
    p_renderBendTableToUser(
        p_processBends(
            p_initTables()
        )
    );
    return 1;
}

app.get('/', function() {
    doAll();
});

app.listen(3030, function(err, res){
    if (err) {
        return console.error(err);
    }
    console.log('Server Started on Port 3030...');
});

app.listen(3030, function(err, res){
    if (err) {
        return console.error(err);
    }
    console.log('Server Started on Port 3030...');
});

以下代码名为run @ PORT:3000

var express = require('express');
var sql = require('sqlite3');

app = express();

app.get('/bend/:id', function(req, res){
    var db = new sql.Database('<mySQLite3Path>/rebarFabTypes.db');
    db.get("SELECT bend, type FROM fabtype WHERE bend = '"+req.params.id+"'", function(err, row) {
        if (typeof row !== 'undefined') {
            console.log(row.type);
            res.end(JSON.stringify({"row" : row.type}));
        } else {
            res.end(JSON.stringify({"row" : "UNKNOWN"}));
        }
    });
    db.close();
});

app.listen(3000, function(err, resp){
    console.log('Server Started on Port 3000...');
});

1 个答案:

答案 0 :(得分:1)

看起来您的问题可能就在这一行。

http.get('http://localhost:3000/bend/'+bendStr, 'utf-8', function(err, res) {

通过文档 - https://nodejs.org/api/http.html#http_http_get_options_callback,http.get的第二个参数应该是一个函数。在你的情况下,它是第三个参数(这是节点似乎在堆栈跟踪中抱怨的)

尝试删除第二个参数 utf-8 ,您应该可以通过该错误。