我试着找出为什么我在调用.form
后使用request.post
设置发布请求的表单。
这是官方文档中的代码段
request.post('http://service.com/upload', {form:{key:'value'}})
// or
request.post('http://service.com/upload').form({key:'value'})
// or
request.post({url:'http://service.com/upload', form: {key:'value'}},
function(err,httpResponse,body){ /* ... */ })
我对第二个例子request.post('http://service.com/upload').form({key:'value'})
感到困惑。
在我看来,它不应该工作,因为一旦调用了request.post(...),就会发送请求。然后,对.form
的调用就像您在发送请求后设置帖子表单一样。那怎么能起作用呢?有什么不对吗?
答案 0 :(得分:4)
然后对.form的调用就像您在发送请求后设置发布表单一样。那怎么能起作用呢?
显然,当你这样做时:
request.post('http://service.com/upload')
请求不会立即发送。相反,它是在事件循环的下一个刻度上发送的(setImmediate()
或process.nextTick()
)。
因此,当您执行request(...).form({key:'value'})
时,.form()
有机会在请求发送之前修改请求。
在the doc for .post()
中,有这样的陈述解释:
对于高级案例,您可以通过r.form()访问表单数据对象本身。这可以被修改,直到在事件循环的下一个循环中触发请求。 (请注意,此调用表单()将清除该请求的当前设置表单数据。)
在上述声明中,r
是调用request.post()
的返回值,因此r.form()
指的是request.post(...).form(...)
,这是您的具体情况。
而且,在the source code中就是这个评论:
// start() is called once we are ready to send the outgoing HTTP request.
// this is usually called on the first write(), end() or on nextTick()