On Friday, 25 August 2017 at 05:25:09 UTC, Hasen Judy wrote:
What libraries are people using to run webservers other than
vibe.d?
Don't get me wrong I like the async-io aspect of vibe.d but I
don't like the weird template language and the fact that it
caters to mongo crowd.
I think for D to a have good web story it needs to appeal to
serious backend developers, not hipsters who go after fads
(mongodb is a fad, jade/haml is a fad).
I probably need to combine several libraries, but the features
I'm looking for are:
- Spawn an HTTP server listening on a port, and routing
requests to functions/delegates, without hiding the details of
the http request/response objects (headers, cookies, etc).
- Support for websockets
- Runs delegates in fibers/coroutines
- Basic database connectivity (No "orm" needed; just raw sql).
- When iterating the result set of a sql query, has the ability
to automatically map each row against a struct, and throw if
the structure does not match.
- More generally, map any arbitrary object (such as json) to a
struct. Something like Zewo/Reflection package for swift[0].
[0]: https://github.com/Zewo/Reflection
I feel like Vibe.d satisfies my first 3 requirements, but for
the rest I will probably have to look for something else.
Don't get me wrong I like the async-io aspect of vibe.d but I
don't like the weird template language and the fact that it
caters to mongo crowd.
Don't use these components :-)
- Spawn an HTTP server listening on a port, and routing
requests to functions/delegates, without hiding the details of
the http request/response objects (headers, cookies, etc).
Vibe.d does this - just don't use the automatic API generation
feature if you don't like it. Note, you can get access to the
request/response objects even if you do use the API generation by
using an @before method. E.g. in an interface you may have
something like this:
@method(HTTPMethod.POST)
@before!getRequestInfo("requestInfo")
@property Token login(LoginRequestMeta login, RequestInfo
requestInfo);
And then define your getRequestInfo method like this:
static RequestInfo getRequestInfo(HTTPServerRequest req,
HTTPServerResponse res)
{
RequestInfo requestInfo;
requestInfo.headers = req.headers;
requestInfo.ipAddress = req.clientAddress.toAddressString();
requestInfo.userAgent = requestInfo.headers.get("User-Agent",
"");
return requestInfo;
}
In this case I've grabbed the ip address and user agent of the
user, but you could also grab cookies etc.
- When iterating the result set of a sql query, has the ability
to automatically map each row against a struct, and throw if
the structure does not match.
You can do this with MySQL Native whilst using vibe.d. You might
do something like this:
Prepared prepared = prepare(this.conn, sql);
prepared.setArgs(params);
auto row = prepared.queryRow();
if (row.isNull()) {
throw new Exception("Query returned an empty row");
}
T item;
try {
row.toStruct!T(item);
} catch(Exception e) {
}
Where T is your struct type that you're trying to convert the row
to.
As for the template language, you could try:
http://code.dlang.org/packages/diamond
https://github.com/repeatedly/mustache-d
There are probably others.