Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 向第三方API发送带有GET请求的标头_Javascript_Node.js_Node Fetch - Fatal编程技术网

Javascript 向第三方API发送带有GET请求的标头

Javascript 向第三方API发送带有GET请求的标头,javascript,node.js,node-fetch,Javascript,Node.js,Node Fetch,我正在尝试构建一个小型的全堆栈应用程序,其中我的前端代码将只与后端交互,后端将调用第三方API获取结果,然后对其执行任何操作。我使用的第三方API需要一个接受,app_id和app_key任何请求的标题 我可以通过Postman直接向我的第三方API发送GET请求,并获取结果,但当我尝试通过我的NodeJS API发送GET请求时,我收到的是状态403。为此,我正在使用节点获取 我使用的API是 下面是我的index.js文件的代码 require('dotenv').config(); co

我正在尝试构建一个小型的全堆栈应用程序,其中我的前端代码将只与后端交互,后端将调用第三方API获取结果,然后对其执行任何操作。我使用的第三方API需要一个
接受
app_id
app_key
任何请求的标题

我可以通过Postman直接向我的第三方API发送
GET
请求,并获取结果,但当我尝试通过我的NodeJS API发送
GET
请求时,我收到的是
状态403
。为此,我正在使用
节点获取

我使用的API是

下面是我的
index.js
文件的代码

require('dotenv').config();

const express = require('express');
const router = require('./routes/router');
const cors = require('cors');
const app = express();

const port = process.env.PORT || '5000';
const host = process.env.HOST || 'localhost';

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

app.listen(port, () => console.log(`server is up and running at http://${host}:${port} `));
这是我的
router.js
文件的代码

const express = require('express')
const fetch = require('node-fetch');

const router = express.Router();
const BASE_URL = process.env.BASE_URL;
const fields = 'definitions';

router.get('/', (req, res) => {
    res.json({
        status: "successfully connected !"
    });
});

router.post('/create', (req, res) => {

    console.log(req.body);
    console.log(req.body.word);
    const url = `${BASE_URL}entries/en-gb/${req.body.word}?fields=${fields}&strictMatch=true`;
    const newHeaders = {
        "Accept": "application/json",
        "app_id": process.env.APP_ID,
        "app_key": process.env.API_KEY
    }

    fetch(url, { method: 'GET', headers: { newHeaders } })
        .then((results) => {
            console.log(results);
        }).then(results => {
            res.json(results);
        }).catch((err) => { console.log(err) });

});

module.exports = router;
以下是我收到的
结果
:-

Response {
  size: 0,
  timeout: 0,
  [Symbol(Body internals)]: {
    body: PassThrough {
      _readableState: [ReadableState],
      _events: [Object: null prototype],
      _eventsCount: 5,
      _maxListeners: undefined,
      _writableState: [WritableState],
      allowHalfOpen: true,
      [Symbol(kCapture)]: false,
      [Symbol(kTransformState)]: [Object]
    },
    disturbed: false,
    error: null
  },
  [Symbol(Response internals)]: {
    url: 'https://od-api.oxforddictionaries.com/api/v2/entries/en-gb/swim?fields=definitions&strictMatch=true',
    status: 403,
    statusText: 'Forbidden',
    headers: Headers { [Symbol(map)]: [Object: null prototype] },
    counter: 0
  }
}
请放心,
环境变量
都设置了准确的值

我希望ale能够附加
标题
,并向第三方API发送
GET
请求,并成功获取结果。此外,我希望能够将这些
结果
发送回我的客户

关于我的代码,我有几个问题

  • 在快车路线内使用
    fetch
    是否正确
  • 如果是,为什么会返回状态403
  • 如果没有,正确的方法是什么
  • 这是什么意思
  • headers:headers{[Symbol(map)]:[Object:null-prototype]},
    我是网络开发的新手,所以这个问题对这里的一些老手来说可能很愚蠢,但请帮我解决。我已经阅读了以下资源,但没有一个对我有帮助:-

    编辑:


    我使用了
    app id
    app key
    而不是
    app\u id
    app\u key
    ,我现在已经纠正了,但问题还没有解决。

    正如我在评论中提到的,你有一个打字错误:


    headers:{newHeaders}
    --
    newHeaders
    已经是一个对象,所以使用
    headers:newHeaders

    检查,您将看到头名称应该是
    app\u id
    app\u key
    。您使用了
    app-id
    app-key
    。您好。谢谢你指出这一点。我更正了错误,但响应仍然相同。您说
    headers:{newHeaders}
    ,但
    newHeaders
    已经是一个对象。尝试
    headers:newHeaders
    。无论如何,请检查发出的请求。@Leegodard谢谢。这解决了我的问题。在进一步调整代码之后,我现在能够获取数据了。