如题,小弟打算用 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ㄒ)/
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ㄒ)/~~
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。