Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.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 如何在同一app.get函数内的res.redirect方法上传递req.setHeaders方法?_Javascript_Node.js_Express - Fatal编程技术网

Javascript 如何在同一app.get函数内的res.redirect方法上传递req.setHeaders方法?

Javascript 如何在同一app.get函数内的res.redirect方法上传递req.setHeaders方法?,javascript,node.js,express,Javascript,Node.js,Express,下面是app.get方法,我想在其中获取用户输入的参数,然后将其重定向到bing api以返回图像搜索的搜索结果。大api要求将api密钥传递到标题中,就像Ocp Apim订阅密钥一样:•••••。 我该怎么做 由于现在听起来您只是想从远程站点获取数据,然后将其作为原始请求的响应返回,因此您可以使用,然后通过管道将该响应作为原始http请求的响应来实现这一点 app.get('/imagesearch/:image*', function(req, res){ console.log(r

下面是app.get方法,我想在其中获取用户输入的参数,然后将其重定向到bing api以返回图像搜索的搜索结果。大api要求将api密钥传递到标题中,就像Ocp Apim订阅密钥一样:•••••。 我该怎么做


由于现在听起来您只是想从远程站点获取数据,然后将其作为原始请求的响应返回,因此您可以使用,然后通过管道将该响应作为原始http请求的响应来实现这一点

app.get('/imagesearch/:image*', function(req, res){
    console.log(req.params.image);
    console.log(req.query.count);
    res.redirect('https://api.cognitive.microsoft.com/bing/v5.0/images/search?q='+req.params.image+'&count='+req.query.count);
});

app.listen(PORT, function(){
   console.log('Express listening on: '+PORT); 
});

你不能这样设置标题。重定向告诉浏览器转到特定的URL。当浏览器转到该URL时,它将设置自己的标题。您无法控制这些标题。所以,你要求的是一个非初学者。不行。你需要以一种不同的方式实现你想要实现的一切。此外,我认为您也不想将订阅密钥传递给任何询问您的浏览器。您是真的想重定向,还是只想获取该URL上的内容,然后将其作为对当前请求的响应返回到浏览器。如果这样做,当您从node.js中请求内容时,可以设置所需的标题,然后可以通过管道将响应传回。您实际上是作为这个结果的代理。@jfriend00-是的,我只是想从重定向url抓取内容到我的页面,基本上只是通过管道传输数据,是的。我如何做到这一点?只是一个简单的问题,我也可以通过在bing api url上执行fs.createReadStream,然后将该响应传递回GET请求来做到这一点吗?@ZaidHumayun-不是直接的
fs.createReadStream()
不知道如何获取URL的内容。这就是
request()
库的作用。它知道如何获取URL的内容并将其转换为读取流、在请求上设置自定义头、处理错误等。。。
request()
库为您创建读取流,并将所需URL的内容放入该读取流中。您可以编写自己的代码来实现这一点,但为什么呢?请求库已经编写好了,经过良好测试的代码来实现这一点。如果我想过滤从request方法收到的响应,然后再将其传输回我的主res,我知道我可以使用下划线库来实现这一点。如何将请求中的响应导入变量或文件中。我尝试用fs.createWriteStream(object_变量)代替res作为管道参数,但没有成功。@ZaidHumayun-您有很多选择。这确实是另一个问题的主题。最优雅的方法是使用变换流对象。您可以通过管道将
request()
流传输到transform对象中,该对象将输出修改后的流,然后通过管道将其传输到响应中。您可以将整个
request()
放入内存,对其进行修改,然后将修改后的数据作为响应发送。您可以将数据通过管道传输到写入流(如
request('s)中)保存到文件中http://google.com/doodle.png“).pipe(fs.createWriteStream('doodle.png'))
,修改数据等等…@ZaidHumayun-FYI,这里有一篇关于流和转换流的好文章:
app.get('/imagesearch/:image*', function(req, res){
    console.log(req.params.image);
    console.log(req.query.count);
    res.redirect('https://api.cognitive.microsoft.com/bing/v5.0/images/search?q='+req.params.image+'&count='+req.query.count);
});

app.listen(PORT, function(){
   console.log('Express listening on: '+PORT); 
});
const request = require('request');

app.get('/imagesearch/:image*', function(req, res){
    let options = {
        url: 'https://api.cognitive.microsoft.com/bing/v5.0/images/search?q='+req.params.image+'&count='+req.query.count,
        headers: {"Ocp-Apim-Subscription-Key": "xxxxx"}
    };
    request(options).pipe(res);
});