Comments (4)
This is clearly documented in the readme.
Empty strings and null values will omit the value, but the equals sign (=) remains in place:
Qs.stringify({ a: '' }); // 'a='
Qs.parse('a');
results in { a: '' }
so your re-stringified object gets the =
added to it. It could be changed, though if there's some consensus that omitting the =
is the desired behavior.
from qs.
I think you misunderstand the reason why I posted the issue. It's not that I'm surprised by the behavior of stringify
given the output of parse
. Rather, I'm surprised by the fact that stringify doesn't perfectly reverse the result of parse
in these cases. I also understood, going into writing the issue, why it's happening, i.e. the fact that parse
gives ''
for those valueless keys. The problem is that it happens at all, under the assumption that the assertion above is an important one.
I'm not sure what a good solution is since it's reasonable to expect that a=
should parse to either null
or ''
. There's also a case to be made that { a: null }
and { a: '' }
should stringify to a=
. But there are APIs out there that expect no =
to work correctly, and there's currently no way to stringify a query object using qs to get what they require (if there was, then you could have parse
produce that instead, and all would be well). An option might be worth considering but that doesn't help when using popular packages like node-request, which in turn use qs (unless they open up their API to allow you to configure qs.
Basically, I'm trying to use the following composition of requests:
//requests using baseRequest() will set the 'x-token' header
var baseRequest = request.defaults({
uri: 'http://someapi.com'
qs: {
foo: '', // won't work because of how qs.stringify works
bar: 1
}
})
//requests using specialRequest() will include the qs set in
//baseRequest and will also include additional parameters
var specialRequest = baseRequest.defaults({
qs: {
baz: 1
}
})
While I could manually add the query string:
//requests using baseRequest() will set the 'x-token' header
var baseRequest = request.defaults({
uri: 'http://someapi.com?foo&bar=1'
})
I cannot extend it:
//requests using specialRequest() will include the qs set in
//baseRequest and will also include additional parameters
var specialRequest = baseRequest.defaults({
qs: {
baz: 1
}
})
The problem is that this essentially results in a qs.stringify(qs.parse(url.parse(url).query))
and the url of specialRequest
is now incorrect. However, I think one should expect qs.stringify(qs.parse(url.parse(uri).query))
not to cause a problem under any circumstances.
from qs.
While I agree with you in principle, there are other conversions that cause qs.stringify(qs.parse(url.parse(uri).query))
to return an altered string. Arrays being one of them.
I'll look in to adding an option to omit the =
when stringifying if the value is null
or ''
. I'm not comfortable changing the default without a consensus from other users, however, so that does mean that pull requests will have to be made to other libraries that rely on qs
to make sure that they allow sending options where relevant.
from qs.
There's an option to omit the =
for null
values now, see #85. closing this
from qs.
Related Issues (20)
- Keeping nesting with custom decoder ? HOT 1
- qs.parse decoder option doesn't work on IOS web view environment HOT 1
- Unable to parse back a stringified object when too nested HOT 3
- `stringify` with `arrayFormat: 'comma'` does not encode commas in strings. HOT 13
- [spam]
- ESM & CJS - Built HOT 9
- Stringify null values HOT 9
- None. HOT 1
- Serialization for `Date` is not working when using `filter` option. HOT 3
- Issue using qs while using Express@5 HOT 7
- qs.stringify(json) and qs.parse(json) Results are inconsistent with expectations HOT 4
- Parsing the stringify result would lead to a different object HOT 1
- qs parse is not letting app load on production when imported from index.tsx HOT 1
- Feature request: export another endpoint that doesn't depend on function-bind and possibly other polyfills HOT 10
- Does not work in NextJS edge middleware HOT 3
- Stringify method with format: "RFC1738" does not encode parentheses -> ( ) HOT 3
- I'm appreciate with this library, however my new project use python. Are there any same packages in Python? HOT 1
- How can you keep the square brackets when using arrayFormat: comma HOT 4
- Add required key and type checking HOT 2
- qs.parse return different while the query is in different position HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from qs.