Javascript 如何在Node.js请求中以相同的名称发布多个值

Javascript 如何在Node.js请求中以相同的名称发布多个值,javascript,forms,node.js,post,request,Javascript,Forms,Node.js,Post,Request,我需要使用node.js和Request以编程方式将多个值提交到一个POST(在本例中为美国states) 例如,HTML表单可能是 <select name="stateprov[]" id="stateprov" multiple="multiple" > 如何使用请求来执行此操作?考虑到我有一个状态数组,['CA','WI',],我已经尝试过了 form['stateprov[]'] = states fails it generates stateprov%5B

我需要使用node.js和Request以编程方式将多个值提交到一个POST(在本例中为美国states)

例如,HTML表单可能是

<select name="stateprov[]" id="stateprov" multiple="multiple" >
如何使用请求来执行此操作?考虑到我有一个状态数组,['CA','WI',],我已经尝试过了

form['stateprov[]'] = states  
   fails 
it generates stateprov%5B%5D[0]=WI&stateprov%5B%5D[1]=CA as the output
form['stateprov[]']=states.join(',')也不起作用

顺便说一句,节点人,我真的很喜欢这个项目,有很多很酷的东西,但是你的文档不是很好

后续:我认为问题可能在于Request()使用qs()对表单数据进行编码,并添加了无关的[0]和[1]。节点的内置queryString()执行我想要的编码


后续2:与Mikeal Rogers聊天,他在支持请求方面做得很好,他基本上说我不能在请求中这样做。因为我没有利用请求的许多很酷的功能,所以我会看看更基本的http。

很抱歉回答我自己的问题,但万一其他人遇到这个问题

Mikeal Rogers当然是对的。Request使用npm包qs()作为他的查询字符串解析器,无论好坏,当它“字符串化”一个数组时,它会添加“[n]”

function stringifyArray(arr, prefix) {
  var ret = [];
  if (!prefix) throw new TypeError('stringify expects an object');
  for (var i = 0; i < arr.length; i++) {
    ret.push(stringify(arr[i], prefix + '[' + i + ']'));  <<< see here
  }
  return ret.join('&');
}

在请求外部声明表单对象。然后,调用querystring.stringify(表单)它返回所需的字符串,并将该字符串附加到url。以手动方式编码url可避免子类和更新问题。

偶然发现此问题,但从未使用restler使其正常工作。我确实发现它可以使用npm模块“request”just do正常工作

import request from 'request';
let data = { subject: 'a message', recipients:['person1@gmail.com', 'person2@gmail.com'] }
// define your data above. I was having issues with the recipients needing to repeat
let options = {
  form: data, qsStringifyOptions: {arrayFormat: 'repeat'}
}
request.post(url, options, function(err, res, body){
   //callback. note request sends 3 params to callback 
})

我把它包装在Q库中以做出承诺。效果很好。因为我需要切换库,所以有点痛苦,但希望这能帮助soemone,他后来偶然发现了这一点。

您是仅使用HTTP还是使用express之类的模块来实现这一点?如果有人偶然发现了这一点,就像我一样,qs现在似乎有一个
指示s:false
选项将禁用此行为。不确定这是否有用…事实上,将请求中的
qsStringifyOptions
arrayFormat:repeat
组合在一起,现在应该可以在不修改请求的情况下执行此操作。谢谢,总有一天我会尝试一下。useQuerystring:true,这就是您现在所需要的一切。您可以作为一个真正的救世主,
qstringifyoptions:{arrayFormat:'repeat'}
option在任何地方都没有文档记录,它就像一个符咒!如果有人使用请求承诺来到这里,
qstringifyoptions:{arrayFormat:'repeat'}
需要在一年多后的请求官方文档中所述的同一级别的qs上通过,并且此解决方案仍然适用……它像我一直在解决的问题的冠军一样工作。已经在使用请求,但不知道qsStringifyOptions提供的完整选项变体。谢谢。很高兴知道隐藏的gem,
qsStringifyOptions:{arrayFormat:“方括号”}
。在表单数据中传送数组时非常有用。这保存了我的测试!我需要调用一个API,为同一个参数传递多个值,并在中添加qsStringifyOptions,这样做就成功了。
var Request = require('request/request.js');  // IMPORTANT - specify request.js, don't get index.js!!!
var querystring = require('querystring');

MyRequest.prototype = Object.create(Request.prototype);
MyRequest.prototype.constructor = MyRequest;

function MyRequest(options, callbackfn) {
  "use strict";
  if (callbackfn)
    options.callback = callbackfn;
  options.method = options.method || 'POST';
  Request.prototype.constructor.call(this, options);
}

MyRequest.prototype.form = function (form) {
  "use strict";
  if (form) {
    this.setHeader('content-type', 'application/x-www-form-urlencoded; charset=utf-8');
    this.body = querystring.stringify(form).toString('utf8');
    return this;
  }

  else
    return Request.prototype.form.apply(this, arguments);
};


module.exports = MyRequest;
var querystring = require('querystring');
var form = {
//form parameters
}
request.post(http + querystring.stringify(form), callback);
import request from 'request';
let data = { subject: 'a message', recipients:['person1@gmail.com', 'person2@gmail.com'] }
// define your data above. I was having issues with the recipients needing to repeat
let options = {
  form: data, qsStringifyOptions: {arrayFormat: 'repeat'}
}
request.post(url, options, function(err, res, body){
   //callback. note request sends 3 params to callback 
})