0

使用postman请求微信服务器接口,微信服务器直接返回一张图片,貌似是以二进制形式返回的,下面有截图。
现在为了傻瓜化流程,用koa框架去代替postman的过程发送请求,接收到的二进制不知道怎么返回到客户端显示成一个图片了?如果吧接收到的内容打印到控制台显示为如下乱码

ctx.type="image/png"
ctx.status = 200;

先改了响应头,那么接收到的二进制内容是用res.body响应么?还是要使用流?。。。代码如下

"use strict";

var router = require('koa-router')();
var koa = require('koa');
var fs = require('fs');
var app = new koa();
var request = require('request');
var qs = require('querystring');

let options = {
    method: 'GET',
    url: 'a'
};

let options1 = {
    method: 'POST',
    url: 'b,
    json: true
};


router.get('/', (ctx, next) =>{
    ctx.type="image/png"
    ctx.status = 200;
    request(options, async (err, res, body)=> {
        if (err) {
            console.log(err)
        } else {
            access_token = JSON.parse(body).access_token
            next()
        }
    })
});


let a = (ctx,next)=>{

    request(option1,(err, res, body) =>{
        if (err) {
            console.log(err)
        } else {
          
            res.body =body
        }
    })
}
app.use(router.routes());
app.use(a)

app.listen(3001);

4个回答

0

试试这样

ctx.type = type; // type - string
ctx.attachment(name); // name - string
ctx.body = data; // data - stream
0

要么你就先把文件流保存成图片存起来,然后把链接发给前端。

要么就直接把文件流发给前端,前端通过res.blob()获取到blob流,创建一个FileReader组成一个文件。

0
  1. 将你的request包装成promise

  2. ctx.body = await requestxxx();

0

应该是你的编码格式指定错了,option中不能指定json: true选项

const router = require('koa-router')();
const request = require('request');

router.get('/', async function(ctx, next) {
    await new Promise(function(resolve, reject) {
        var req = request({
            method: 'GET',
            encoding: null,
            uri: 'http://images5.fanpop.com/image/photos/30900000/beautiful-pic-different-beautiful-pictures-30958249-1600-1200.jpg'
        }, function(err, response, body) {
            if (err) {
                return reject(err);
            }
            resolve(body);
        });
    }).then((body) => {
        ctx.status = 200;
        ctx.type = 'jpg';
        console.log(Buffer.isBuffer(body));
        ctx.length = Buffer.byteLength(body);
        ctx.body = body;
    }).catch((err) => {
        console.error(err);
    });
});

module.exports = router;

encoding: null 配置不能省略,默认是utf8,这里下载图片,body应该是Buffer类型的

撰写答案