如何在快递应用程序中正确调用外部api来构建我自己的resti api?

时间:2016-02-19 01:33:08

标签: angularjs node.js api rest express

我正在尝试创建一个restful api但是我需要使用外部api quandl来构建我的api,当我尝试使用来自客户端的api(内置angularjs)时,我得到500内部服务器错误而且没有指定了默认引擎,并且在命令行中未提供扩展名。我知道我的api工作,因为我用邮递员测试它,它只是不在客户端工作。 我试着查看这篇文章:express js 4 how to serve json results without rendering any views /css但它没有帮助。

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;

1 个答案:

答案 0 :(得分:0)

如果您没有在快递中为任何视图或html文件指定任何内容服务引擎,则不会出现默认引擎指定错误。

尝试使用 app.set(' views',' html page location'); app.set('查看引擎',' jade');

您可能还需要另外要求玉。