Angularjs 如何正确地从express应用程序内部调用外部api来构建自己的restful api?

Angularjs 如何正确地从express应用程序内部调用外部api来构建自己的restful api?,angularjs,node.js,api,rest,express,Angularjs,Node.js,Api,Rest,Express,我正在尝试创建一个restful api,但我需要使用一个外部api quandl来构建我的api,当我尝试从客户端(内置于angularjs中)使用我的api时,我得到一个500内部服务器错误,没有指定默认引擎,命令行中也没有提供扩展。我知道我的api工作,因为我用postman测试了它,但它不能从客户端工作。 我试着看了这篇文章:但没有用 module.exports = function(io){ var q = require('q'); var request = re

我正在尝试创建一个restful api,但我需要使用一个外部api quandl来构建我的api,当我尝试从客户端(内置于angularjs中)使用我的api时,我得到一个500内部服务器错误,没有指定默认引擎,命令行中也没有提供扩展。我知道我的api工作,因为我用postman测试了它,但它不能从客户端工作。 我试着看了这篇文章:但没有用

module.exports = function(io){
    var q = require('q');
    var request = require('request');
    var mongoose = require('mongoose');
    var Stock = mongoose.model('Stock');
    var base_url = "https://www.quandl.com/api/v3/datasets/WIKI/";
    var dotjson = ".json" 
    var apiKey = "?api_key=" + process.env.quandl_apiKey;

    function sendJsonResponse(res,status,content){
        res.status(status);
        res.json(content);
    }

    // get stock data using quandl api  
    function stockData(name){
        var deferred = q.defer();
        var d = new Date();
        var year = d.getFullYear();
        var month = d.getMonth() + 1;
        var date = d.getDate();

        request({
            url: base_url + name + dotjson + apiKey,
            qs:{
                start_date:(year-1) + '-' + month + '-' + date,
                end_date:year + '-' + month + '-' + date
            }
        },function(error,response,body){
            if(error){
                deferred.reject('Error: ' + error);
            }else if(response.statusCode !== 200){
                deferred.reject('Invalid Status Code: ' + response.statusCode);
            }else{
                deferred.resolve(body);
            }

        })

        return deferred.promise;
    }

    // get stock data that is stored in database
    function getStockInDatabase(req,res){
        Stock.find({},function(err,stock){
            if(err){
                sendJsonResponse(res,404,err);
            } else {
                sendJsonResponse(res,200,stock);
            }
        })
    }

    // create stock data to be stored in database
    function createStockData(req,res){
        var stockDatas;
        stockData(req.body.name.toUpperCase())
               .then(function(stock){
                  stockDatas = JSON.parse(stock);
                  Stock.create({
                    name:stockDatas.dataset.name,
                    symbol:stockDatas.dataset.dataset_code
                  },function(err,stk){
                    if(err){
                        sendJsonResponse(res,400,err)
                    }else{
                        sendJsonResponse(res,201,stk);
                        io.emit('stock',stockDatas);
                    }
                  })
               })
              .catch(function(err){
                sendJsonResponse(res,404,err);
              })
    } 

    // delete stock data in database
    function deleteStockData(req,res){
        Stock
            .findByIdAndRemove(req.body._id)
            .exec(function(err,stock){
                    if(err){
                        sendJsonResponse(res,404,err);
                    }else {
                        sendJsonResponse(res,204,null);
                    }
            })
    } 

    return {
        getStockInDatabase:getStockInDatabase,
        createStockData:createStockData,
        deleteStockData:deleteStockData
    }
}
要使用api的角度服务:

  (function(){
   'use strict'
    angular
     .module('app.common')
     .factory('stockService',stockService);

     stockService.$inject = ['$http'];

     function stockService($http){

        function getStock(){
            return $http.get('/api/stocks');
        } 

        function getStockInDatabase(){
            return $http.get('api/stocks/database');
        }

        function createStock(data){
            return $http.post('/api/stocks',data);
        }

        function deleteStock(data){
            return $http.delete('/api/stocks',data);
        }

        return{
            getStockInDatabase:getStockInDatabase,
            createStock:createStock,
            deleteStock:deleteStock
        }

     }
})()
app.js配置

require('dotenv').load();
var express = require('express');
var socketio = require('socket.io');
var path = require('path');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var io = socketio();
require('./api/models/db'); 

var app = express();
app.io = io;
var apiRoute = require('./api/routes/index')(io);
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use(express.static(path.join(__dirname, 'client')));

app.use('/api', apiRoute);

app.use(function(req, res) {
  res.sendFile(path.join(__dirname, 'client', 'index.html'));
});

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  var err = new Error('Not Found');
  err.status = 404;
 next(err);
});

// error handlers

// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
  app.use(function(err, req, res, next) {
   res.status(err.status || 500);
   res.render('error', {
   message: err.message,
   error: err
   });
  });
}

// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
  res.status(err.status || 500).send({
  message: err.message,
  error: {}
 })
});


module.exports = app;

未在express中指定任何内容服务引擎时,不会出现默认引擎指定错误。。用于查看或html文件

试用 app.set('views','html页面位置'); 应用程序集(“查看引擎”、“翡翠”)


您可能还需要jade。

如果您未在express中指定任何内容服务引擎,则不会出现默认引擎指定错误。。用于查看或html文件

试用 app.set('views','html页面位置'); 应用程序集(“查看引擎”、“翡翠”)


您可能还需要jade。

可能外部服务器不支持跨源ajax调用?好的,所以我需要找到一种方法,在使用quandl时绕过跨源ajax调用。如果您从服务器获取数据,该服务器应该支持@CrossOrigin调用。您无法在客户端执行任何操作。通常情况下,CORS会在回复时引用
访问控制允许源站
标题出错。我想你可能还有另一个问题。如果它是在邮递员工作,那么问题很可能是你的客户。您可以从Angular客户端发布调用函数的片段吗?此外,如果您可以控制Express服务,您可以通过在服务中提供代理路由绕过CORS。这样,您的客户端将调用您的Express API,而Express API将向第三方服务发出请求并将响应返回给您。可能外部服务器不支持跨源ajax调用?好的,因此我需要找到一种方法,在使用quandl时绕过跨源ajax调用。如果您从服务器获取数据,该服务器应支持@CrossOrigin调用。您无法在客户端执行任何操作。通常情况下,CORS会在回复时引用
访问控制允许源站
标题出错。我想你可能还有另一个问题。如果它是在邮递员工作,那么问题很可能是你的客户。您可以从Angular客户端发布调用函数的片段吗?此外,如果您可以控制Express服务,您可以通过在服务中提供代理路由绕过CORS。这样,您的客户机将调用您的Express API,而Express API将向第三方服务发出请求并将响应返回给您。