在NodeJS上redirect图片请求
在我的应用程序代码中,对于一组特定的API,我正在做一个像下面这样的NodeJS请求,它应该返回一个图像作为正文。 这个相同的请求对邮差工作正常(我可以看到图像)。
module.exports = { getThumbnail: function (thumbnailUrn, env, token, onsuccess){ request({ url: config.baseURL(env) + config.thumbail(thumbnailUrn), method: "GET", headers: { 'Authorization': 'Bearer ' + token, } }, function (error, response, body) { // error check removed for simplicity... onsuccess(body); }); } }
上面的代码在我自己的安全检查下运行并添加了令牌标头。 它工作正常(请求调用返回200 /确定)。
现在在我的应用路由器,我想作为一个图像作为回应,但输出不被解释为一个图像。 这是我有什么:
var dm = require(/*the above code*/); // express router var express = require('express'); var router = express.Router(); router.get('/getThumbnail', function (req, res) { var urn = req.query.urn; dm.getThumbnail(urn, req.session.env, req.session.oauthcode, function (thumb) { res.writeHead(200, { 'Content-Type': 'image/png' } ); // at this point, the 'thumb' variable is filled // but I believe is not properly encoded... // or maybe the res.end output is missing something... res.end(thumb, 'binary'); }); }); module.exports = router;
编辑 :由Nodari Lipartiya评论,这是一种代理行为(服务器(响应与图像) – >代理(node.js /重新发送到客户端) – >最终用户)
我不确定什么会回来thumb
,但下面的代码似乎为我工作(为简单起见,绕过Express):
var http = require("http") var fs = require("fs") var server = http.createServer(listener) server.listen(() => { console.log(server.address().port) }) var binary = fs.readFileSync("path to local image") function listener(req, resp) { resp.writeHead(200, { 'Content-Type': 'image/png' } ); resp.end(new Buffer(binary), "binary") }
如果将它包装在Buffer
会发生什么?
如果我正确地理解了一切:我做到了
server.js
var fs = require('fs'); var express = require('express'); var app = express(); app.get('/img', function(req, res, next) { var stream = fs.createReadStream('img.jpeg'); var filename = "img.jpeg"; filename = encodeURIComponent(filename); res.setHeader('Content-disposition', 'inline; filename="' + filename + '"'); res.setHeader('Content-type', 'image/jpeg'); stream.pipe(res); }); app.listen(9999, function () { console.log('Example app listening on port 9999!'); });
的proxy.js
var request = require('request'); var express = require('express'); var app = express(); app.get('/img', function(req, res, next) { console.log('proxy/img'); request({ url: 'http://localhost:9999/img', method: "GET", }, function (error, response, body) { res.end(body, 'binary'); }); }); app.listen(9998, function () { console.log('Example app listening on port 9998!'); });
req.js
var request = require('request'); request({ url: 'http://localhost:9998/img', method: "GET", }, function (error, response, body) { console.log('body', body); });
为我工作。 请让我知道你是否需要帮助。