【问题标题】:nodejs failure to load URL due to cross problems由于交叉问题,nodejs无法加载URL
【发布时间】:2015-11-13 06:14:37
【问题描述】:

我正在运行 node.js 应用程序;它工作正常,前端使用 angular.js
问题是我得到了:

XMLHttpRequest 无法加载 localhost:3000/api/data_history。跨域请求仅支持协议方案:http、data、chrome、chrome-extension、https、chrome-extension-resource。(匿名函数)@

从此代码:

app.use(function (req, res, next) {
    // Website you wish to allow to connect
    res.setHeader('Access-Control-Allow-Origin', properties.clientHost);

    // Request methods you wish to allow
    res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');

    // Request headers you wish to allow
    res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');

    // Set to true if you need the website to include cookies in the requests sent
    // to the API (e.g. in case you use sessions)
    res.setHeader('Access-Control-Allow-Credentials', true);

    // Pass to next layer of middleware
    next();
});

【问题讨论】:

  • 如果您不设置 CORS 标头,这是预期的结果。在我看来,您正在尝试从与运行 Angular 应用程序不同的主机访问您的 API。
  • 同一主机不同端口我在节点中为我的app.js添加了上面的代码仍然是同样的问题
  • 您能否向我们展示您的客户端代码。另外,如果可能的话,将服务器端和客户端代码都归结为MCVE?
  • 不同的端口也可以做到这一点——您必须在 CORS 标头中定义允许的端口。也就是说,如果您将其投入生产,您应该使用反向代理将其托管在受信任的端口(80、443)上。

标签: javascript angularjs node.js cors


【解决方案1】:

看起来你正在使用 express.... 而不是手动执行,使用这个中间件怎么样:https://www.npmjs.com/package/cors 有时它是一个简单的解决方案

var sqlite3    = require('sqlite3').verbose();
var db         = new sqlite3.Database('data/demodb02');
var express    = require('express');
var cors       = require('cors');
var app        = express();
var bodyParser = require('body-parser');
var fs = require('fs');


app.use(cors());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());


db.serialize(function() {
    //db.run("CREATE TABLE IF NOT EXISTS counts (key TEXT, value INTEGER)");
    db.run("CREATE TABLE IF NOT EXISTS sensor (id INT PRIMARY KEY, sensor_type integer, data real)");
    db.run("CREATE TABLE IF NOT EXISTS location (longitude real NOT NULL, latitude real NOT NULL, sensor_id  integer, PRIMARY KEY (longitude, latitude), CONSTRAINT id FOREIGN KEY (sensor_id) REFERENCES sensor(id))");
    db.run("CREATE TABLE IF NOT EXISTS data_live (sensor_id INTEGER, sensor_data REAL, time time, CONSTRAINT id FOREIGN KEY (sensor_id) references sensor(id) CONSTRAINT data FOREIGN KEY (sensor_data) references sensor(data))");
    db.run("CREATE TABLE IF NOT EXISTS data_history (sensor_id INTEGER, sensor_data REAL, time time, date date, CONSTRAINT id FOREIGN KEY (sensor_id) references sensor(id) CONSTRAINT id CONSTRAINT data FOREIGN KEY (sensor_data) references sensor(data))");
    db.run("CREATE TABLE IF NOT EXISTS client (login varchar(50), password varchar(50), user_id integer, sensor_id integer, CONSTRAINT id FOREIGN KEY (sensor_id) references sensor(id))");


    // test //
    //db.run("INSERT INTO counts (key, value) VALUES (?, ?)", "counter", 0);
    db.run("INSERT INTO sensor (id, sensor_type, data) VALUES (?, ?, ?)", 1, 4, 8);
    db.run("INSERT INTO sensor (id, sensor_type, data) VALUES (?, ?, ?)", 2, 9, 4);
    db.run("INSERT INTO sensor (id, sensor_type, data) VALUES (?, ?, ?)", 3, 7, 1);
    db.run("INSERT INTO sensor (id, sensor_type, data) VALUES (?, ?, ?)", 4, 1, 15);
    db.run("INSERT INTO location (longitude, latitude, sensor_id) VALUES (?, ?, ?)", 50, 45, 1);
    db.run("INSERT INTO data_live (sensor_id, sensor_data, time) VALUES (?, ?, ?)", 1, 8, "08:44");
    db.run("INSERT INTO data_history (sensor_id, sensor_data, time, date) VALUES (?, ?, ?, ?)", 1, 8, "08:45", "12/05/2015");
    db.run("INSERT INTO client (login, password, user_id, sensor_id) VALUES (?, ?, ?, ?)", "user", "user", 1, 1);

    // fin test //
});


// dynamically include routes (Controller)//
fs.readdirSync('./controllers').forEach(function (file) {
  if(file.substr(-3) == '.js') {
      route = require('./controllers/' + file);
      route.controller(app, db);
  }
});
//include the rules engine files //

/*s.readdirSync('./rules').forEach(function (file) {
  if(file.substr(-3) == '.js') {
      route = require('./rules/' + file);
      //route.controller(app, db);
  }
});*/


app.listen(3000)

console.log("Submit GET or POST to http://localhost:3000/api");

【讨论】:

  • 谢谢大家,但我使用 express 实际上是的,我确实安装了 cors 是徒劳的..
  • 抱歉没看懂您的评论...已经解决还是安装模块后问题依旧?
  • 问题依旧,我说我已经安装了cors模块但没有任何改变..
  • 你能粘贴一些代码吗?我想看看你是如何使用模块和路由的
  • 这是 app.js,然后我在一个单独的文件夹中定义了控件:对于 5 个表,它工作正常:
猜你喜欢
  • 1970-01-01
  • 2012-06-19
  • 2017-07-23
  • 2020-04-22
  • 2023-01-27
  • 2011-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多