我正在尝试为我正在编写的程序设置一个快速服务,该程序联系外部 API,然后返回结果,以便将其存储在我设置的 Mongo 中。
这看起来应该相当简单,但我是 Node.js/Express 的新手,并且收到“发送后无法设置 header ”错误。
我正在从外部 API 获取所需的数据,但如何将该数据正确发送回我的 Angular app.js,以便它可以在我的表中更新?
“addSelected()”是我在 app.js 中调用的函数来启动该过程。 “数据”在完整响应中打印部分内容,但随后中断并给出“发送后无法设置 header ”错误。据我了解,这是发送响应,然后尝试修改响应头。但我不确定解决方法,或者我是否只是格式化所有错误,因为这是我第一次在 MEAN 堆栈中摇摆一般。
我知道问题出在 server.js 中的“res.send(data)”行,但我不知道如何正确格式化响应。
我的代码:
服务器.js
//server.js
//setup ==============================
var express = require ('express');
var request = require('request');
var app = express();
var mongoose = require('mongoose');
var https = require('https');
//config ============================
app.use(express.static(__dirname + '/public/'));
console.log("running PipeHelper");
mongoose.connect('mongoedit');
var Schema = mongoose.Schema;
var opSchema = new Schema({
title: String,
description: String,
company: String,
post_date: String,
close_date: String,
contact: String,
location: String,
url: String,
notice_type: String
});
var item = mongoose.model('item', opSchema);
//routes===========================
//returns full database
app.get('/api/db', function(req, res){
item.find({},function(err, items){
if (err) res.send(err);
res.json(items);
});
});
//searches FBO for opportunities to add to database
app.get('/api/search:FBO_key', function(req, res){
var data;
console.log("2");
var baseURL = "api.data.gov"
var params = "/gsa/fbopen/v0/opps?q=" + req.params.FBO_key;
params += "&api_key="+"keyyyy";
params += "&all";
params += "&start=0";
params += "&p=1";
params += "&limit=10";
url = baseURL+params;
var options = {
port: 443,
host: 'api.data.gov',
path: params,
method: 'GET'
};
//get FBO data
var request = https.request(options, function(response){
console.log("4");
response.on('data', function (chunk){
//response data to send back to app.js
data += chunk.toString();
res.send(data);
});
});
console.log("3");
request.end();
request.on('error', function(e){
console.error(e);
});
});
app.get('/', function(req,res){
res.sendfile('./public/index.html');
});
app.listen(8000);
app.js
var app = angular.module("pipeHelper", ['smart-table']);
app.controller('mainCtrl', [
'$scope', '$http', function($scope, $http){
$scope.selected = [];
$scope.displayData= [];
$scope.items=[];
$scope.FBOsearch;
//populates table on startup with whole DB
$http.get('./api/db')
.success(function(data){
$scope.items=data;
$scope.displayData = [].concat($scope.items);
})
.error(function(data){
console.log('Error: '+data);
});
$scope.addSelected = function(){
//search FBO, add opportunities, update table
console.log("1");
$http.get('./api/search'+'NGA')
.success(function(data){
console.log("5");
console.log(data);
$scope.items=data;
$scope.displayData= [].concat($scope.items);
})
.error(function(data){
console.log('Error: ' +data);
});
};
$scope.isSelected = function(item){
//if its selected, remove it
// if its unselected, add it
if ($scope.selected.indexOf(item)==-1){
$scope.selected.push(item);
}
else{
$scope.selected.splice($scope.selected.indexOf(item), 1);
}
console.log($scope.selected);
//temp placeholder function. Eventually add to array of selected objects for placement in Pipeliner/deletion
};
}]);
最佳答案
解决了问题。我不知道 response.on('data')
被多次调用,因此多次调用我的 res.send(data)
并不完全导致它因错误而崩溃。我在请求函数中添加了以下内容:
response.on('end'function(){
res.send(data);
};
基本上外部API数据进来完毕,就用express发送过来。我想边做边学吧。希望这最终能帮助某人。
关于javascript - 来自 Express/Node.js 内部的 HTTP 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32634751/