koa获取第三方API数据后,进行前端页面重定向和渲染时,报错:重复发送请求头。

新手上路,请多包涵

问题描述:表单数据提交到KOA后台,KOA后台请求第三方API数据,根据返回不同的数据,对页面进行重定向或者其他render操作。现在没有用request中间件,用的node原生http.request()请求API数据,但是不论是cxt.redirect()还是cxt.render()都会报Error: Can't set headers after they are sent.错误。

var http = require('http');
var querystring = require('querystring');

module.exports = {
    'POST /signin': async (ctx, next) => {
        //获取页面数据
        var username = ctx.request.body.username || '',
            password = ctx.request.body.password || '';

        // 封装HTTP请求的数据
        var postData = querystring.stringify({
            "UserName": username,
            "Password": password
        })
        // 设置HTTP请求选项
        var options = {
            host: 'apis.*******.com',
            path: '/common/v1/domain/security/authentication',
            method: 'PUT',
            headers:{
                "Content-Type":"application/x-www-form-urlencoded; charset=UTF-8",
                "Accept": "application/json"
            }
        }

        // 发送HTTP请求
        var req = http.request(options, function(res){
            var dataJSON;
            console.log('Got Response :' + res.statusCode);
            res.on('data', function(d){
                dataJSON = JSON.parse(d);
                console.warn(dataJSON);
            });
            res.on('end', function(){
                if(dataJSON.Result){
                    //存储当前用户session
                    ctx.session.user = {
                        shortName: dataJSON.UserName,
                        password: dataJSON.Password,
                        userName: dataJSON.FullName
                    }
                    ctx.redirect('/list/A00');
                } else {
                    console.log('signin failed!');
                    ctx.render('signin-failed.html', {
                        title: 'Sign In Failed'
                    });
                }
            });
        });
        req.on('error', function(e){
        // console.error('Got Error:' + e.message);
            ctx.render('signin-failed.html', {
                title: 'Sign In Failed'
            });
        });
        req.write(postData);
        req.end();
    }
};

报错信息如下:
clipboard.png

阅读 8.3k
1 个回答

我用koa2利用request库请求豆瓣api,可以获取数据,但无法通过ctx.body返回前端,百度有些说request返回回调函数而async要求返回Promise,于是换成request-promise库,在then中使用ctx.body,前端还是获取不到,到底怎么用呢?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题