javascript - 来自 Express/Node.js 内部的 HTTP 请求

标签 javascript angularjs node.js express

我正在尝试为我正在编写的程序设置一个快速服务,该程序联系外部 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/

相关文章:

javascript - 完全卡住 const 变量

javascript - 如何在考虑缓存的情况下延迟加载 iframe

node.js - 从 GitHub 操作中的 Node 程序运行 Powershell 脚本

javascript - HTML5 文件系统 API - 让用户将文件保存到他们的实际文件系统

javascript - 回调在 AngularJS 调用 REST 服务时如何工作?

javascript - 自定义指令 : How evaluate bindings with dynamic HTML

javascript - 使用javascript键入后隐藏文本

node.js - 依赖项共享的 NPM 依赖项

javascript - 无法使用 onKeyup 或 onChange 填充输入框

javascript - ASP.NET MVC 4 JQuery 对话框