我需要为get创建一个url,这个url将接受数组,如何在node.js/express中从请求中提取数组?

jum4pzuy  于 2022-12-18  发布在  Node.js
关注(0)|答案(9)|浏览(231)

我需要为get创建一个url,它将接受数组,如何在node.js/express中从请求中提取数组?我需要传递带有名称的数组,需要从Person返回哪些参数

model.

/api/person # here I need to pass which fields I want to see but to be generic.
amrnrhlw

amrnrhlw1#

一种选择是使用JSON格式。

http://server/url?array=["foo","bar"]

服务器端

var arr = JSON.parse(req.query.array);

或您自己的格式

http://server/url?array=foo,bar


服务器端

var arr = req.query.array.split(',');
58wvjzkj

58wvjzkj2#

当查询参数在请求URL中重复多次时,Express会将其公开为数组:

app.get('/', function(req, res, next) {
   console.log(req.query.a)
   res.send(200)
}

GET /?a=x&a=y&a=z:
// query.a is ['x', 'y', 'z']

这同样适用于其他方法中的req.body。

xesrikrc

xesrikrc3#

您可以用percent encoding编码数组,只需要“覆盖”一个字段,正式地连接这些值。

app.get('/test', function(req,res){
    console.log(req.query.array);
    res.send(200);
});



localhost:3000/test?array=a&array=b&array=c

此查询将打印['a','b','c']

8wigbo56

8wigbo564#

使用下一个代码:

app.use('/', (req, res) => {
    console.log(req.query, typeof req.query.foo, Array.isArray(req.query.foo));
    res.send('done');
});

在后端,有两种标准方法。对于下一个请求:
1./?foo= 1和foo =2
1./?foo[]= 1和foo []=2
您的NodeJS后端将接收下一个查询对象:
1.{ foo:[“1”,“2”] }“对象”为真
1.{ foo:[“1”,“2”] }“对象”为真
所以,你可以选择你想要的方式。我的建议是第二个,为什么?如果你需要一个数组,并且你只传递一个值,那么选项一会把它解释为一个常规值(字符串),而不是数组。
[我说过我们有两个标准,但这是不对的,URL中的数组没有标准,这是两种常见的方式。每个Web服务器都有自己的方式,如Apache、JBoss、Nginx等]

kx5bkwkv

kx5bkwkv5#

如果你想从url参数传递一个数组,你需要按照下面的例子:

URL示例:

https://website.com/example?myarray[]=136129&myarray[]=137794&myarray[]=137792

要从Express中检索它:

console.log(req.query.myarray)
[ '136129', '137794', '137792' ]
hts6caw3

hts6caw36#

Express有一个工具可以检查您的路径是否与您正在创建的路线匹配:Express.js route tester .
正如Jose Mato所说,您必须决定如何构建您的URL:
1.?foo= 1和foo =2
1.?foo[]= 1和foo []=2
如果您选择方法1,http请求应该如下所示:
http://baseurl/api/?foo=1&foo=2
您的路径应具有以下逻辑:

app.get('/api/:person', (req, res) => {
    /*This will create an object that you can iterate over.*/
    for (let foo of req.params.foo) {
      /*Do some logic here*/
    }
});
6pp0gazn

6pp0gazn7#

您可以传递由斜杠分隔的数组元素- GET /API/person/foo/bar/...
将路径定义为'/api/person/(:arr)*'
req.params.arr将有第一个参数。req.params[0]将有其余的字符串。你用这两个拆分并创建一个数组。

app.get('/api/person/(:arr)*', function(req, res) {
        var params = [req.params.arr].concat(req.params[0].split('/').slice(1));
        ...
});

GET /api/person/foo
params = ["foo"]

GET /api/person/foo/bar
params = ["foo", "bar"]

...

fquxozlt

fquxozlt8#

这里使用这个,'%2C'是逗号的HTML编码字符。

jsonToQueryString: function (data) {
   return Object.keys(data).map((key) => {
        if (Array.isArray(data[key])) {
            return encodeURIComponent(`${key}=${data[key].map((item) => item).join('%2C')}`);
        }
        return encodeURIComponent(`${key}=${data[key]}`);
    }).join('&');
}

访问查询参数

const names = decodeURIComponent(req.query.query_param_name);
const resultSplit = names.split(',');
ubby3x7f

ubby3x7f9#

当数组参数只包含一个值时就会出现问题,因为它的行为就像一个简单的字符串,或者当它不包含任何值时。
例如:

  • ?数组参数=5
  • ?数组参数= 5和数组参数=6

下面是一个函数,它总是将具有给定名称的参数提取为一个数组:

export function extractArrQueryParams(
  req: express.Request,
  paramName: string
) {
  let param = req.query[paramName];
  let returnArray = [];

  if (Array.isArray(param)) {
    for (let e of param) {
      returnArray.push(e);
    }
  } else {
    if (param) {
      returnArray.push(param);
    }
  }

  return returnArray;
}

相关问题