来自Express / Node.js的HTTP请求

我正在尝试为一个程序设置一个快速服务,我正在写这个联系人的一个外部API,然后返回结果,以便它可以存储在我设置的Mongo中。

这似乎应该是相当简单的,但我是新的Node.js / Express,我得到一个“发送后无法设置标头”错误。

我从外部API获取我想要的数据,但是如何正确地将数据发送回我的A​​ngular app.js,以便在我的表中更新?

“addSelected()”是我在app.js中调用的函数,用于启动进程。 “数据”打印完整响应的一部分,然后切断,并给我“发送后无法设置标题”错误。 从我理解这是从发送的响应,然后试图修改响应头后的事实..但我不确定的解决方法,或者如果我只是格式化一切错了,因为这是我第一次摆动MEAN堆栈一般。

我知道问题是在server.js中的“res.send(data)”行,但我不知道如何正确地格式化响应。

我的代码:

server.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数据完成进来后,用快递发送。 通过做我学会了解。 希望这能最终帮助别人。

我不能发表评论,所以我只是把它作为一个答案。

我build议安装node-inspector , npm install -g node-debug 。 然后用node-debug server.js运行你的应用程序。 这将产生一个Firefox或Chrome开发工具的新实例,并允许您debugging您的nodeJS代码。 很有用。

你所看到的错误很可能与request.end()相关,如果我猜测的话。 .end()被调用后,您不能再修改标题内容。 我怀疑这会有所作为,但尝试在request.on('error')调用之后放置request.end()

编辑:10/15/15

我强烈build议安装VS代码 。 它有一个内置的节点应用程序debugging器。