为什么 NodeJS 以后可以使用 Chain API 请求 set post form?

Why can NodeJS request set post form later using Chain API?

我想弄清楚为什么我们可以在调用 request.post.

之后使用 .form 为 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 就像您在发送请求后设置 post 表单一样。那么这是如何工作的呢?有什么问题吗?

And then the call to .form is like you are setting the post form after the request has been sent. So how can this work ?

显然,当您这样做时:

request.post('http://service.com/upload')

请求不会立即发送。相反,它被注册(使用 setImmediate()process.nextTick())在事件循环的下一个滴答时发送。

因此,当您执行 request(...).form({key:'value'}) 时,.form() 有机会在发送之前修改请求。

the doc for .post()中,有这样的语句说明:

For advanced cases, you can access the form-data object itself via r.form(). This can be modified until the request is fired on the next cycle of the event-loop. (Note that this calling form() will clear the currently set form data for that request.)

在上面的语句中,r 是调用 request.post() 的 return 值,因此 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()