Javascript Can';无法让简单的AngularJS$http调用正常工作

Javascript Can';无法让简单的AngularJS$http调用正常工作,javascript,angularjs,Javascript,Angularjs,我正在组装我的第一个AngularJS应用程序。我的控制器正在进行$http.get()调用。它所使用的url是正确的,但它最终用404调用“error”方法。当我在Firebug中看到请求的URL时,这就更加令人困惑了,它报告了一个200 我认为我不需要为此显示html。我无法想象这有什么关系 以下是我略带删节的javascript: var diagapp = angular.module("DiagApp", ['ui.bootstrap', 'ngResource']); diagap

我正在组装我的第一个AngularJS应用程序。我的控制器正在进行$http.get()调用。它所使用的url是正确的,但它最终用404调用“error”方法。当我在Firebug中看到请求的URL时,这就更加令人困惑了,它报告了一个200

我认为我不需要为此显示html。我无法想象这有什么关系

以下是我略带删节的javascript:

var diagapp = angular.module("DiagApp", ['ui.bootstrap', 'ngResource']);

diagapp.controller("DiagCtrl", ['$scope', '$interval', '$http', function($scope, $interval, $http) {
$http({method:'GET',url:'http://<hostportandpath>/service/diagnostics/datasourceStatus.json'})
    .success(function (data, status, headers, config) {
        console.log(data);
    })
    .error(function (data, status, headers, config) {
        console.log(data);
    });
}]);
var diagapp=angular.module(“diagapp”,“ui.bootstrap”,“ngResource”);
控制器(“DiagCtrl”[“$scope”、“$interval”、“$http”,函数($scope、$interval、$http){
$http({方法:'GET',url:'http:///service/diagnostics/datasourceStatus.json'})
.success(函数(数据、状态、标题、配置){
控制台日志(数据);
})
.error(函数(数据、状态、标题、配置){
控制台日志(数据);
});
}]);
我尝试在“$http”行设置断点,然后将该行上引用的URL复制并粘贴到另一个浏览器选项卡中,它向我显示了该服务返回的正确json。然后我从断点继续,它在“error”方法中命中断点,状态为404

我可能做错了什么

更新:

我对其进行了修改,使服务调用仅为相对调用,因此不会违反CDP

我还设置了一个“node express”web服务器,在我的webapp根目录下运行,因此它将为webapp中的文件请求提供服务,但对REST服务的任何调用都会被302重定向到另一个域上的服务

当我在Firebug中调试它时,我看到它得到了302,然后我看到它得到了200,所以它显然遵循了重定向。然而,它随后在“error”方法中命中了断点,仍然说它得到了404。换句话说,我得到了完全相同的结果。我糊涂了

更新:

以下是我略为省略的“express server”配置:

var express = require('express');
var app = express();

app.use("/", express.static(__dirname));
app.use(app.router);

app.get('/FooService/*', function(req, res) {
res.redirect(302, 'http://<hostname>' + req.path);
});

app.listen(8000);
var express=require('express');
var-app=express();
app.use(“/”,express.static(_dirname));
应用程序使用(应用程序路由器);
app.get('/FooService/*',函数(req,res){
res.redirect(302,'http://'+req.path);
});
app.listen(8000);

我认为您遇到了一个错误,因为您向另一个域发出的请求违反了同源策略。相反,您应该向您自己域上的服务器发出请求,并让该服务器提供您所需的数据(可能通过从其他域缓存数据)。或者,您可以使用JSON-P,让另一个域调用客户端的方法

更新

因此,为了创建express服务器,我们首先使用
http
库发出
请求
,以获取所需的json数据,并将响应存储在变量
data
中。然后,我们像您一样设置我们的Web服务器,只是我们用数据本身来响应,而不是用重定向来响应

var express = require('express');
var http = require("http");
var app = express();
var data;

// Make the request to buffer the data
var options = {
    host: 'somesite.com',
    port: 1337,
    path: '/some/path',
    method: 'GET',
    headers: {
        'Content-Type': 'application/json'
    }
};

var req = http.request(options, function(res)
{
    var output = '';

    res.on('data', function (chunk) {
        output += chunk;
    });

    res.on('end', function() {
        data = JSON.parse(output);
    });
});

req.on('error', function(err) {
    //res.send('error: ' + err.message);
});

req.end();

// Start the webserver to respond with the data

app.use("/", express.static(__dirname));
app.use(app.router);

app.get('/FooService/*', function(req, res) {
    response.writeHead(200, { 'Content-Type': 'application/json'});
        response.end(data);
});

app.listen(8000);

注意,我还没有能够测试所有这些,所以您可能需要进行一些调整,但我已经对Node、Express和Angular做了非常类似的事情,我相信这种类型的事情会起作用。您可能希望通过将请求放入setTimeout或在app.get方法中按需发出请求来调整数据在服务器上缓存的频率(但这会更慢)。您可以在此处阅读有关http.request()的更多信息:

如果您的服务需要任何类型的身份验证(甚至启用了CORS),您可以在
$http
config对象中设置
with credentials:true
,它将发送选项preflightOk,我熟悉同源策略,我想我有一种错觉,$http可以绕过它。我想我将考虑使用“node express”或其他一些方法来构建一个简单的可配置代理。好的,我做了大量工作来设置“node express”web服务器,这样它就可以从我的webapp中服务本地文件,但将调用重定向到REST服务的相对路径,再重定向到一个可以提供该服务的服务器。我用“wget”的原始调用对此进行了测试,结果很好。在Firebug中,我看到它得到302,然后是200,然后是显示404的“error”方法中的断点。我将其设置为一个相对路径,并将其设置为可以调用实际服务,但结果是相同的。由于某种我不理解的原因,它命中了error方法。那么是调用success和error回调还是只调用error?您是否尝试过在与js代码相同的目录中获取静态json文件?也许你可以用express服务器更新这个问题?只调用错误回调。我会用我的express服务器配置更新帖子。啊,我明白了。是的,Angular正在期待一个包含某种数据的响应。用302重定向进行响应是行不通的。我用我认为你应该做的方式更新了我的答案。基本上,JSON数据需要来自您的服务器。