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

发布于 2022-09-04 10:37:07 字数 2336 浏览 12 评论 0

问题描述:表单数据提交到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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

好久不见√ 2022-09-11 10:37:07

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文