moleculer-web
Advanced tools
Changelog
0.10.4 (2022-01-09)
<a name="0.10.3"></a>
Changelog
0.10.2 (2021-09-05)
Many developers issued that version 0.10 doesn't support multiple routes with the same path. This version fixes it but you should give a unique name for the routes if they have same path.
Example
You can call /api/hi
without auth, but /api/hello
only with auth.
const ApiGateway = require("moleculer-web");
module.exports = {
mixins: [ApiGateway],
settings: {
path: "/api",
routes: [
{
name: "no-auth-route", // unique name
path: "/",
aliases: {
hi: "greeter.hello",
}
},
{
name: "with-auth-route", // unique name
path: "/",
aliases: {
"hello": "greeter.hello",
},
authorization: true
}
]
}
};
removeRouteByName(name: string)
method to remove a route by its name.<a name="0.10.1"></a>
Changelog
0.10.1 (2021-09-01)
bodyParser: true
. #258pathToRegexpOptions
to route options to make available to pass options to path-to-regexp
library. #268debounceTime
to route options to make available to change the debounce time at service changes. #260errorHandler
method to allow developers to change the default error handling behaviour. #266<a name="0.10.0"></a>
Changelog
0.10.0 (2021-06-27)
Many users issued that at file uploading the response always wrapped into an array even single file uploading. This issues is fixed in this version.
If you define files: 1
in busboy settings, the response won't be wrapped into array.
Example
const ApiGateway = require("moleculer-web");
module.exports = {
mixins: [ApiGateway],
settings: {
path: "/upload",
routes: [
{
path: "/upload",
busboyConfig: {
limits: {
files: 1
}
},
}
]
}
};
In early version, if you added multiple routes, you should always set JSON body-parser. As of v0.10, it's the new default, if you don't define bodyParsers
in the route options. If you don't want to use any body-parsers just set bodyParsers: false
.
Example: disable body parsers
const ApiGateway = require("moleculer-web");
module.exports = {
mixins: [ApiGateway],
settings: {
routes: [
{
path: "/api",
bodyParsers: false
}
]
}
};
The addRoute
and removeRoute
methods exposed to service actions, as well. It means, you can add/remove routes from remote nodes, as well.
Adding a new route
broker.call("api.addRoute", {
route: {
path: "/api",
aliases: {
"hi": "greeter.hello"
}
},
toBottom: true // add this route to the end of the route list.
})
Removing a route
broker.call("api.removeRoute", { path: "/api" });
There are two new logging service settings: logRequest
, logResponse
. You can define the logging level for request & response log messages.
const ApiGateway = require("moleculer-web");
module.exports = {
mixins: [ApiGateway],
settings: {
logRequest: "debug", // Logging with debug level
logResponse: false, // Disable logging
//.....
}
};
rootCallOptions
optionsThere a new rootCallOptions
property in the service settings. Here you can define the root Context
calling options. It can be a static Object
or a Function
. It can be useful to take some data from the req
and put them to the calling options (like tracing informations)
Example with static object
const ApiGateway = require("moleculer-web");
module.exports = {
mixins: [ApiGateway],
settings: {
routes: [/*...*/],
rootCallOptions: {
timeout: 500
}
}
};
Example with Function which takes tracing information from the req and put them to the calling options
const ApiGateway = require("moleculer-web");
module.exports = {
mixins: [ApiGateway],
settings: {
routes: [/*...*/],
rootCallOptions(options, req, res) {
if (req.headers["traceparent"]) {
// More info https://www.w3.org/TR/trace-context/#traceparent-header
const traceparent = req.headers["traceparent"].toLowerCase();
if (traceparent.match(/^([0-9a-f]{2})-([0-9a-f]{32})-([0-9a-f]{16})-([0-9a-f]{2})$/)) {
const [version, id, parentSpan, flags] = traceparent.split("-");
const sampled = (flags & FLAG_SAMPLED) == FLAG_SAMPLED;
options.parentSpan = {
id: parentSpan,
traceID: id,
sampled
};
}
} else {
// Look for X-B3-Traceid, X-B3-Spanid
options.parentSpan = {};
if (req.headers["x-b3-traceid"]) {
options.parentSpan.traceID = req.headers["x-b3-traceid"].toLowerCase();
options.parentSpan.sampled = true;
}
if (req.headers["x-b3-spanid"]) {
options.parentSpan.id = req.headers["x-b3-spanid"].toLowerCase();
}
}
}
}
};
You can define multiple REST aliases in the action definitions.
module.exports = {
name: "posts",
settings: {
rest: ["/posts", "/v1/posts"]
},
actions: {
find: {
rest: ["GET /", "GET /all"]
handler(ctx) {}
}
}
};
Several issues has been fixed with multipart handling.
/api/upload/:tenant/:folder
) is available via ctx.meta.$params
ctx.meta.$multipart
ctx.params.$params
is not available, use ctx.meta.$params
ctx.params
is {}
and the fields are in ctx.meta.$multipart
.ctx.meta
in case of errors, as well.publish: false
condition. Use `visibility: "public", instead.<a name="0.9.1"></a>