Nodejs API:默认情况下似乎启用了CORS

时间:2018-03-30 11:06:36

标签: node.js api cors

这是我的问题:我有一个站点exemple.com和一个节点服务器,其中我的API在exemple.com:3000上运行。我希望我的API只能通过exemple.com访问。

所以我认为Same-Origin Policy会阻止来自除我的每个站点的每个请求,如果我在响应中发送标题:Access-Control-Allow-Origin:https:exemple.com。

问题是,如果我在另一个网站上调用网址:http://exemple.com:3000/api/v1/test/search,我会收到错误:

无法加载https://exemple:3000/api/v1/test/search:“Access-Control-Allow-Origin”标头的值“https://exemple.com”不等于提供的来源。因此,不允许原点“http://randomsite.com”访问。

但是在网络标签中,我的回复是200状态和所有结果。

如何同时获得错误和结果?这是我的代码:

app.js

"content_game"."id"

路由/ api.js

const corsApiOptions = {
  origin: 'https://exemple.com',
  originSuccessStatus: 200,
};

app.use('/api/v1', cors(corsApiOptions), api);

如果我从randomsite.com的控制台发出ajax请求,结果如下:

  const express = require('express'); const mongoose =
     require('mongoose'); const mongoosastic = require('mongoosastic');
     const AssoSchema = require('../schemas/assoSchema');

    const router = express.Router();

     router.post('/assos/search', (req, res) => {   let { query } =
     req.body;   if (query && query.length > 0) {
         query = query
           .split(' ')
           .map(el => `${el}~`)
           .join(' ');

        mongoose.connect('mongodb://localhost/mydb');
        AssoSchema.plugin(mongoosastic);

         const Asso = mongoose.model('asso', AssoSchema, 'assos');
         Asso.search(
           {
             query_string: { query },
           },
           { hydrate: true },
           (err, results) => {
             if (err) res.json({ error: err });
             res.json(results.hits.hits);
        },
       );   } else res.json(''); });

    module.exports = router;

在预览标签中,我可以在json中看到我的所有10个结果。

我希望我的api只能从exemple.com访问,有人可以帮助我吗?

1 个答案:

答案 0 :(得分:2)

  

但是在网络标签中,我的回复是200状态和所有结果。

     

如何同时获得错误和结果?

同源策略阻止JavaScript(嵌入在不同来源的网页中)读取响应中的数据。

浏览器强制执行

它不会阻止发出请求。

它不会阻止浏览器获得响应。

它不会阻止浏览器的所有者通过其他方式(例如“网络”选项卡)查看响应,即使这样做,他们也可以使用其他工具(例如cURL)发出HTTP请求。

CORS允许服务器告诉浏览器放宽同源策略并允许JavaScript访问数据。

  

我希望我的api只能从exemple.com访问,有人可以帮助我吗?

这是不可能的。

其他来源的JavaScript将无法直接读取数据,但它对非JS方法或间接(例如通过代理)方法没有任何作用。