Are this two routes same in nodejs? - node.js

Routes in Express:
/search/:company-name
/search/:category-name
I can see that first one is fired for both requests so they are same, but is there a way to solve this without involving for example:
/search/company/:company-name
/search/category/:category-name

Yes, they are the same.
The router just see a route that starts with search/ and ends with a wildcard. The only thing that change is the name you give to that wildcard, which doesn't matter for the router, it's still the same URL.
You can solve this by either changing the route, or you can parse the route argument (the wildcard) and do something different depending on its value.

You could use a query instead of a param.
Your urls would be:
/search?company=company-name
/search?category=category-name
Your route is /search and you use req.query instead of req.params.
It's either that,
or your solution of changing the route,
or somehow parsing the parameter to decide whether it's a company or a category
or changing your route to a post and using key-value pairs in the post body

Related

Difference between operators in a URL

What's the difference between using : and ? in a URL? For example /products/:id and /products?id=1? I am trying to get the values from the URL like this Product.findById (req.params.id) but I was wondering which one is most suitable. I know using : do I have to use req.params and ? req.query but I don't understand the difference between them, are they the same?
in my point of view, it is totally different if you are using RESTFUL API pattern
/products/:id called path parameters
The path parameters determine the resource you’re requesting for. Think of it like an automatic answering machine that asks you to press 1 for service, press 2 for another service, 3 for yet another service and so on.
Path parameters are part of the endpoint itself and are not optional
but query parameters
Technically, query parameters are not part of the REST architecture, and they used to help you completely understand how to read and use API’s Query parameters give you the option to modify your request with key-value pairs.
Having your parameters in the query is conceptually optional to the router, query parameters are more of properties and descriptions of the request itself, like when saying GET /users?sort=asc, in this case, the sort attribute was more of a description to the request and the request could complete the fetch without it, that might not always be the case, but a query parameter still describes its request even if it was mandatory.
On the other hand, URL parameters are part of the request itself, the URL without the parameter doesn't make sense, like GET /users/:userID, in this case, not supplying userID will supply unexpected data (A list of users for example) if it didn't break the router completely. URL parameters play part in defining the request rather than just describing it, and they can't be optional.

Slim 3: best way to pass variables (that depends on request) to layout?

I need to pass variable to a Twig layout about user country and language.
These datas are determined from the route, so I can't get them before routing is done.
I could set them from the route callbacks but code would be repeated in each route.
So I added a middleware to routes. It reads request arguments and sets variables (through $twig->getEnvironment()->addGlobal(...)).
I am not fully convinced, is there a better way to achieve this?
thanks

what's the wreq's way of creating custom cookies?

I want to make HTTP requests with some known cookie key-value pairs (e.g k1=v1; k2=v2; ...) using wreq, but can't find a convenient way of creating them.
Because Cookie has many fields, I'd prefer a smart constructor than having to fill all fields on my own.
By browsing documents, I find generateCookie to be the most promosing one (and that's also the only one I've found that returns a Cookie): I can create SetCookie and all I need are just key value pairs. But we don't have a Request to feed it as the second argument. Using http-client alone, one can do parseUrl to create one. But in wreq I feel the author want to hide Request from user and I can't find a function that gives us direct access to it.
So my question is: are there better ways to create cookies in wreq than using Cookie constructor?
I'd probably fork the generateCookie implementation, as it looks like the Request argument is used only to validate the fields.
http://hackage.haskell.org/package/http-client-0.4.26.2/docs/src/Network-HTTP-Client-Cookies.html#generateCookie, except for default cookie path, as SetCookie has Maybe path.

Sails give 404 on get-parameters with "."

I have SPA sails app. All route i my SPA app, at first enter in welcome action controller.
'/*' :{
controller : 'Web/welcomeController',
skipAssets : true
}
All others routes using like api, for ajax request. This route '/*' using just for first render page. All others render provide angularjs. And there, one of route have get parameter with dot.
http://localhost:1337/search?lat=40.714545&long=-74.007112
And I get 404 error. All this is due to the parameter skipAsset, which ignores url with the content dot.
I need to controller also skip assets resource like image, js, ect. But correctly process requests with get parameters which content dot /?lat=40.714545&long=-74.007112
skipAssets should probably be fixed to ignore the query string. But in the meantime, you can use skipRegexinstead of skipAssets. From the Sails.js docs on custom routes:
If skipping every URL containing a dot is too permissive, or you need
a route's handler to be skipped based on different criteria entirely,
you can use skipRegex. This option allows you to specify a regular
expression or array of regular expressions to match the request URL
against; if any of the matches are successful, the handler is skipped.
Note that unlike the syntax for binding a handler with a regular
expression, skipRegex expects actual RegExp objects, not strings.
So something like:
'/*' :{
controller : 'Web/welcomeController',
skipRegex : /^[^?]+\./
}
would probably be sufficient.

Correct order of connect.js middlewares?

middleware depend on each other, for example methodOverride() checks
req.body.method for the HTTP method override, however bodyParser()
parses the request body and populates req.body. Another example of
this is cookie parsing and session support, we must first use()
cookieParser() followed by session()_.
I wonder how can we know which middleware should be use before another? I wonder if there already exist an ordered list (a list with all middlewares in correct working order) somewhere?
The list of middleware on connect's home page is in the correct order, though it doesn't explicitly call out dependencies.

Resources