Angularjs 如何正确地从express应用程序内部调用外部api来构建自己的restful api?
我正在尝试创建一个restful api,但我需要使用一个外部api quandl来构建我的api,当我尝试从客户端(内置于angularjs中)使用我的api时,我得到一个500内部服务器错误,没有指定默认引擎,命令行中也没有提供扩展。我知道我的api工作,因为我用postman测试了它,但它不能从客户端工作。 我试着看了这篇文章:但没有用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
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将向第三方服务发出请求并将响应返回给您。