求助大神!superagent 怎么使用 yield ? 加了 redirects 就报错。。。
发布于 9 年前 作者 594WangHao 5880 次浏览 最后一次编辑是 8 年前 来自 问答

如题,小弟打算用 superagent 模拟登陆,但是在用了 yield 之后一直报错/(ㄒoㄒ)/;

因为要登录的网站有多次重定向,之间需要获取 sessionid 进行身份验证,所以必须设置 redirects(0)

相关代码:

var getCASTGC = yield request.post('https://cas.xjtu.edu.cn/login?service=http://ssfw.xjtu.edu.cn/index.portal')
        .redirects(0)
        .set('Cookie', JSESSIONID)
        .set('Content-Type', 'application/x-www-form-urlencoded')
        .send({
            username: username,
            password: password
        })

但是只要设置了就会报错,报错如下。

 Error: Found
      at Request.callback (D:\Practice\node_modules\superagent\lib\node\index.js:603:17)
      at IncomingMessage.<anonymous> (D:\Practice\node_modules\superagent\lib\node\index.js:818:12)
      at emitNone (events.js:91:20)
      at IncomingMessage.emit (events.js:185:7)
      at endReadableNT (_stream_readable.js:926:12)
      at _combinedTickCallback (internal/process/next_tick.js:74:11)
      at process._tickCallback (internal/process/next_tick.js:98:9)

实在不知道怎么解决,百度谷歌都没有相关的介绍。。难道是我的打开方式不对 Orz 求大神指点!不胜感激!

----------------------------------------------------------------------2016-5-21 00:49:02 更新----------------------------------------------------------------------

感觉只要是有重定向而设置了 redirects(0) 的话就会报错,比如这样: 4000端口的服务器设置重定向

var app = require('express')();

app.get('/', function (req, res, next) {
    res.redirect('/haha');
});

app.get('/haha', function (req, res, next) {
    res.send('hello world')
})

app.listen(4000, console.log('4000 port'));

3000端口的设置为在访问时用 superagent 请求 4000 端口

var app = require('koa')();
var request = require('superagent');

app.use(function*(next) {
    var res = yield request
        .get('http://localhost:4000')
        .redirects(0)			// 这一步加上的话就会报错,不加的话会自动跟随重定向

    console.log(res.text)
    this.body = res.text;
})


app.listen(3000, console.log('3000 port'));

只要中间加了 redirects(0) 就会报错。。不知道为什么。。而且函数会被执行两次 /(ㄒoㄒ)/

14 回复

Error: Found 应该是这句… 可以再单步调试下…

@magicdawn 不啊,感觉只要是有重定向而设置了 redirects(0) 的话就会报错,比如这样:

4000端口的服务器设置重定向

var app = require('express')();

app.get('/', function (req, res, next) {
    res.redirect('/haha');
});

app.get('/haha', function (req, res, next) {
    res.send('hello world')
})

app.listen(4000, console.log('4000 port'));

3000端口的设置为在访问时用 superagent 请求 4000 端口

var app = require('koa')();
var request = require('superagent');

app.use(function*(next) {
    var res = yield request
        .get('http://localhost:4000')
        .redirects(0)			// 这一步加上的话就会报错,不加的话会自动跟随重定向

    console.log(res.text)
    this.body = res.text;
})


app.listen(3000, console.log('3000 port'));

只要中间加了 redirects(0) 就会报错。。不知道为什么。。而且函数会被执行两次 /(ㄒoㄒ)/

@594WangHao 我拿你的代码看看…

@594WangHao 找到你的问题了

假设你在用 v1.8.3 https://github.com/visionmedia/superagent/blob/v1.8.3/lib/node/index.js#L818-L821

// redirect
if (redirect && self._redirects++ != max) {
  return self.redirect(res);
}

第一次重定向, self._redirects = 0, 然后 max = 0, 0 != 0被认为 false… 我只想说你这个 redirects(0) 是你自创的吧…文档也没说… 改成 redirects(Infinity), 不过也是慎用…

@magicdawn 😨文档不是说默认跟随五层重定向么😨如果这里不想让他跟随重定向(因为要获取setcookie 然后向重定向页面发送)不是设置为redirects(0)么。。我有点晕+_+了。非常感谢你能帮我解决问题😄我还是太渣了。。。

@594WangHao 你自创的… redirects(0) … 不要想当然 😂

@magicdawn 😱😱😱那怎么取消自动重定向呢,百度和谷歌到的都是resirects(0)啊。。😱😱文档中也没有看到啊 From Noder

@magicdawn 非常抱歉麻烦你,但是我实在是不知道怎么去下重定向了/(ㄒoㄒ)/

@594WangHao : 不知道为什么。。而且函数会被执行两次 /(ㄒoㄒ)/,因为你没有调用 next

@594WangHao 测试你的代码,使用如下的代码进行简单测试:

//index.js
var express = require("express");

var app = express();

app.get('/', function(req, res) {
    console.log("ok");
    res.redirect("/haha");
});

app.get('/haha', function(req, res) {
    res.send("hello world");
});

app.listen(4000, console.log("4000 port"));

下一部分:

// request.js
var request = require("superagent");

request.get("http://localhost:4000")
    .redirects(0)
    .end(function(err, res) {
        console.log(res.text);
    });

这不会报错啊

@htoooth 用 koa 加上 yield 就会报错了。。像这样:

var app = require('koa')();
var request = require('superagent');

app.use(function*(next) {
    var res = yield request
        .get('http://localhost:4000')
        .redirects(0)			// 这一步加上的话就会报错,不加的话会自动跟随重定向

    console.log(res.text)
    this.body = res.text;
})


app.listen(3000, console.log('3000 port'));

如何取消自动跟随重定向呢 求大神解答 /(ㄒoㄒ)/~~

@594WangHao

request.get("http://localhost:4000")
    .redirects(0)
    .end(function(err, res) {
		console.log(err); // 发现 err是有值的。
        console.log(res.text);
    });

 var res = yield request
        .get('http://localhost:4000')
        .redirects(0)			// 因为err 是有值所以报错走不下去了
		

我发现 err 中是有 response 对象的,所以,你可以这样:

co(function*() {
  var res = yield request.get("http://localhost:4000")
                    .redirects(0);

  console.log(res.text);
}).catch(function(err) {
  console.dir(err.response.headers);
});

就可以拿到 headers 对象了,当然你可以有 cookie。

回到顶部