为什么NodeJS稍后可以使用Chain API请求设置发布表单?

时间:2018-05-17 19:39:37

标签: javascript node.js http node-request

我试着找出为什么我在调用.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的调用就像您在发送请求后设置帖子表单一样。那怎么能起作用呢?有什么不对吗?

1 个答案:

答案 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()