我在Firefox上找到了SuperAgent(http://visionmedia.github.com/superagent/)的问题来源.不确定SuperAgent是在AJAX调用中执行它还是FireFox正在触发它.
基本上,每次我进行AJAX调用时,都会在实际的AJAX调用之前在URL上触发OPTIONS方法.很烦人,因为服务器目前不支持OPTIONS.如何在没有废话和重新编码服务器的情况下拨打电话?
谢谢
我正在使用Beego的便捷方法来解析请求正文值,并具有以下内容:
路由器文件:
apiNamespace := beego.NewNamespace("/api")
apiNamespace.Router("/sessions/google/new", &controllers.SessionsController{}, "get:GoogleNewSession")
beego.AddNamespace(apiNamespace)
Run Code Online (Sandbox Code Playgroud)
控制器代码:
func (c *SessionsController) URLMapping() {
c.Mapping("GoogleNewSession", c.GoogleNewSession)
}
func (c *SessionsController) GoogleNewSession() {
// Always serve JSON
defer func() {
c.ServeJson()
}()
// This is always blank
log.Printf("'Received %+v'", c.Ctx.Input.RequestBody)
c.Ctx.ResponseWriter.WriteHeader(200)
return
// truncated
}
Run Code Online (Sandbox Code Playgroud)
前端JS(超级代理):
request
.post('/sessions/google/new')
.use(prefix)
.send({ code: authCode })
.set('Accept', 'application/json')
.end(function(err, res){
console.log("******* request", res.request)
if (res.ok) {
var body = res.body;
console.log('yay got ' + JSON.stringify(res.body));
} else {
console.log("***** err", err);
console.log("***** not …Run Code Online (Sandbox Code Playgroud) 我正在使用React,React-Router和Superagent.我的Web应用程序中需要授权功能.现在,如果令牌过期,我需要将页面重定向到登录页面.
我已将ajax调用功能放在一个单独的模块中,并且令牌将在每个请求的标头上发送.在我的一个组件中,我需要通过ajax调用获取一些数据,如下所示.
componentDidMount: function() {
api.getOne(this.props.params.id, function(err, data) {
if (err) {
this.setErrorMessage('System Error!');
} else if (this.isMounted()) {
this.setState({
user: data
});
}
}.bind(this));
},
Run Code Online (Sandbox Code Playgroud)
如果我收到401(未授权)错误,可能是因为令牌过期或没有足够的权限,该页面应重定向到登录页面.现在,在我的api模块中,我必须使用window.loication="#/login"我不认为这是一个好主意.
var endCallback = function(cb, err, res) {
if (err && err.status == 401) {
return window.location('#/login');
}
if (res) {
cb(err, res.body);
} else {
cb(err);
}
};
get: function(cb) {
request
.get(BASE_URL + resources)
.end(endCallback.bind(null, cb));
},
Run Code Online (Sandbox Code Playgroud)
但是,我不能轻易地在我的api模块中调用react-router方法.有没有一种优雅的方式来实现这个简单的功能?我不想在每个需要授权的反应组件中添加错误回调.
我试图对正在构建URL的php服务器发出请求:
website.com/?q=help&q=moreHelp&q=evenMoreHelp
如何使用superagent传递具有多个值的相同查询?
我试过这个:
req.get( 'website.com')查询({Q: '救命',问: 'moreHelp',问: 'evenMoreHelp'}).结束(...)
但我不确定它实际上是在发送所有三个'q'值.我应该做些什么来确保他们都被送到?
我不能为我的生活得到一个简单的superagent邮政请求工作.这是我的superagent和nock配置.
SuperAgent的:
request
.post('https://test.com/api/login')
.send({
email: 'test@test.com',
password: 'testpassword'
})
.end((err, res) => {
if (err) {
console.log(err);
}
});
Run Code Online (Sandbox Code Playgroud)
箭扣:
nock('https://test.com')
.post('/api/login')
.send({
email: 'test@test.com',
password: 'testpassword'
})
.reply(200, {
id: 1,
token: 'abc'
});
Run Code Online (Sandbox Code Playgroud)
我从nock收到以下错误:
{[错误:诺克:否匹配于请求POST https://test.com/api/login { "电子邮件": "test@test.com", "密码": "testpassword"}]状态:404,的StatusCode: 404,响应:undefined}
另一个奇怪的方面是我的superagent响应处理程序中记录了此错误.所以我知道这个电话正在制作和截获.
我一直在学习Node/Javascript,从一开始就使用promises(我不知道如何不使用promises,并且常常想知道其他人如何在没有它们的情况下相处).
因此,我有时需要"宣传"简单的内容,例如阅读文件fs:
var readFile = function(path) {
return new Promise(function(fulfill, reject) {
fs.readFile(path, function(err, data) {
if (err) { reject(err); }
else { fulfill(data); }
});
});
};
Run Code Online (Sandbox Code Playgroud)
这一直很有效.现在我需要做同样的事情superagent,但它使用的链式风格让我陷入困境.
var request = require('superagent');
request.get(...).set(...).set(...).end(callback); // stuck!
Run Code Online (Sandbox Code Playgroud)
我想end()用一个返回promise 的方法替换方法(或忽略它并添加一个新方法).像这样......
var endQ = function() {
return new Promise(function(fulfill, reject) {
this.end(function(err, res) { // "this" is the problem!
if (err) { reject(err); }
else { fulfill(res); }
});
});
};
// then I could …Run Code Online (Sandbox Code Playgroud) 我正在做一个副项目,我想在其中重用现有的 API。API 有一个/auth端点,用于处理 POST 请求email并password在请求正文中期望和。如果email和password得到验证,则服务器返回一个响应,其中包含一个Authorization标头,该标头包含应在所有后续请求中发送的令牌的值。
我在从响应中检索此标头时遇到问题。它在 Postman 和 Chrome Dev Tools(网络部分)中都可见。
Chrome 开发工具:
console.log 响应头的

我已经尝试了多个库/实现来发送请求(superagent、request、fetch实现甚至XMLHttpRequest),但是,Authorization当我在 Chrome 开发工具中查看它们时,我得到的所有响应都在响应头中包含标头,但是当我尝试访问时来自javascript的标题,我总是最终Content-Type只得到标题。
我在其他几个答案中读到服务器必须在标头中指定Access-Control-Expose-HeadersorAccess-Control-Allow-Headers的Authorization值,但是,我无权访问服务器,并且 API 上没有与此问题相关的问题,所以我的猜测是发送请求时我遗漏了一些东西。
有任何想法吗?
这是使用的请求 fetch
return fetch(endpoint, {
method: 'post',
body: data,
headers: {
[API_KEY_HEADER]: apiKey
}
}).then(r => {
console.log(r);
console.log(r.headers)
});
Run Code Online (Sandbox Code Playgroud)
这是使用的请求 request
r({
url: endpoint,
method: 'post',
headers: …Run Code Online (Sandbox Code Playgroud) 我正在尝试计算文件上传的进度,所以我使用的是Superagent。我能够获得文件上传的进度。
现在,当用户选择取消按钮时,我需要中断或取消发布请求。有没有办法做到这一点。以下是我的代码:
var file = somefile.pdf
Request.post('http://posttestserver.com/post.php?dir=example')
.set("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")
.send(file)
.on('progress', function(e) {
console.log('Progress', e.percent);
})
.end((err, res) => {
console.log(err);
console.log(res);
})
Run Code Online (Sandbox Code Playgroud) 我有一套测试,如果单独运行,它们都会通过。但是,如果并行运行,测试会由于检查 cookie 的值而失败。
问题是 supertest 的 cookie 在每次测试之间都不会被清除。
有没有办法使用 supertest 在每次测试之间清除 cookie?这与这个未提供解决方案的未解决问题有关。
我都尝试过:
afterEach(() => {
request(app)
.set('Cookie', [])
})
Run Code Online (Sandbox Code Playgroud)
和:
afterEach(() => {
request(app)
.set('Cookie', '')
})
Run Code Online (Sandbox Code Playgroud)
...没有用。
以下是单独运行良好但并行运行时失败的两个测试:
test('It should respond 302 to the wrong url', (done) => {
const accessiblePages = {get_member_accessible_pages: []}
nock('http://localhost:8000')
.log(console.log)
.get('/auth/me/')
.reply(200, accessiblePages)
// Must use j: to work with cookie parser
const cookie = 'userInfo=j:' + encodeURIComponent(
JSON.stringify(accessiblePages))
request(app)
.get('/first-url')
.set('Cookie', cookie)
.expect(302)
.expect('Location', '/new-url')
.then((response) => {
expect(response.statusCode).toBe(302) …Run Code Online (Sandbox Code Playgroud) async function checkToken(token) {
const result = await superagent
.post(`${config.serviceUrl}/check_token`)
.send({token});
return result.body;
}
Run Code Online (Sandbox Code Playgroud)
如果此调用返回 401,则默认选项会引发异常,这不是我所期望的。我调用的 API 也使用 HTTP 状态消息作为正文来返回信息,我只需要正文部分。
http 状态 401 的响应是
{
"data": null,
"error": {
"code": "INVALID_TOKEN",
"message": "Token is not valid"
}
}
Run Code Online (Sandbox Code Playgroud)
目前,为了得到这个,我需要用 try...catch 包装所有超级代理调用
async function checkToken(token) {
let result = null;
try {
result = await superagent
.post(`${config.serviceUrl}/check_token`)
.send({token});
} catch (e) {
result = e.response;
}
return result.body;
}
Run Code Online (Sandbox Code Playgroud)
有什么方法可以让第一个示例工作并返回 JSON 而不查看 HTTP 状态?