angularjs - 如何正确调用外部 api 以在express应用程序中使用来构建我自己的restful api?

标签 angularjs node.js api rest express

我正在尝试创建一个restful api,但我需要使用外部api quandl来构建我的api,当我尝试从客户端使用我的api(内置于angularjs)时,我收到500内部服务器错误,并且未指定默认引擎,并且在命令行中未提供扩展。我知道我的 api 可以工作,因为我用 postman 测试了它,它只是在客户端不起作用。 我尝试查看这篇文章: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 的 angular.service :

  (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.. 中为 View 或 html 文件指定任何内容服务引擎时,会出现无默认引擎指定错误。

尝试使用 app.set('views', 'html 页面位置'); app.set(' View 引擎', ' Jade ');

您可能还需要 Jade 。

关于angularjs - 如何正确调用外部 api 以在express应用程序中使用来构建我自己的restful api?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35495748/

相关文章:

javascript - Angular 的过滤问题

javascript - 直接在 MongoDB 中引用 ObjectID 可以,但在 Mongoose 中不行

javascript - 如何实现可重用的回调函数

php - 如何向用户呈现大量重复数据

api - 在许多文件中拆分 swagger 定义

javascript - 在 AngularJS 中只打印一次 div

javascript - Angular .js : taking a picture from a subpage - ng-view issue

node.js - 需要更新的 Twitter 流 nodejs api

angularjs - 从父元素触发子元素中的 ng-click

javascript - Socket.IO 握手安全标志始终为 False