我遇到了问题,在解决这些问题时我觉得不够深入。
一,我对Node的理解非常新/不成熟,我对http的理解并不是最强的。
所以在这里向社区寻求一些有希望的帮助。
我已经审查了我的代码,首先通过使用静态类型的对象数组来抽象它的意图,并在浏览器端运行它以确保所有代码都按预期工作(缺少http.get请求)。
我已经将相同的代码移动到节点服务器端,并使用我在本地使用的相同抽象数据集成功运行它,并且一切正常(主要端口3030实例)。
然后我继续介绍一个http.get,它在一个以上的方面有点复杂。
解释:
我正在做的一切都发生在我的本地机器上,用于测试/非生产状态开发。
在这种情况下,我最终在端口3030上从本地计算机执行http.get请求,并在端口3000上调用另一个节点实例(在单独的cmd.exe实例上运行)。
我已经使用浏览器自行测试了3000,并且它按预期工作:
我启动chrome,转到http://:3000 / bend / 1,然后返回我为其设置的内容(它在URL中提供的最后一个值上运行SQL select语句,并返回一个JSON .stringify(obj)返回浏览器 - 见下图。
然后我将浏览器指向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...');
});
答案 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 ,您应该可以通过该错误。