鍍金池/ 問答/HTML/ nodejs的koa框架向客戶端響應(yīng)圖片response怎么寫

nodejs的koa框架向客戶端響應(yīng)圖片response怎么寫

使用postman請(qǐng)求微信服務(wù)器接口,微信服務(wù)器直接返回一張圖片,貌似是以二進(jìn)制形式返回的,下面有截圖。
現(xiàn)在為了傻瓜化流程,用koa框架去代替postman的過程發(fā)送請(qǐng)求,接收到的二進(jìn)制不知道怎么返回到客戶端顯示成一個(gè)圖片了?如果吧接收到的內(nèi)容打印到控制臺(tái)顯示為如下亂碼

圖片描述

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

先改了響應(yīng)頭,那么接收到的二進(jìn)制內(nèi)容是用res.body響應(yīng)么?還是要使用流?。。。代碼如下

"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);
回答
編輯回答
喵小咪
  1. 將你的request包裝成promise

  2. ctx.body = await requestxxx();

2017年5月8日 19:42
編輯回答
墨沫

應(yīng)該是你的編碼格式指定錯(cuò)了,option中不能指定json: true選項(xiàng)

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 配置不能省略,默認(rèn)是utf8,這里下載圖片,body應(yīng)該是Buffer類型的

2017年2月5日 20:52
編輯回答
薄荷綠

要么你就先把文件流保存成圖片存起來,然后把鏈接發(fā)給前端。

要么就直接把文件流發(fā)給前端,前端通過res.blob()獲取到blob流,創(chuàng)建一個(gè)FileReader組成一個(gè)文件。

2018年5月13日 20:40
編輯回答
脾氣硬

試試這樣

ctx.type = type; // type - string
ctx.attachment(name); // name - string
ctx.body = data; // data - stream
2017年2月10日 01:41