将我的移动应用程序开发转移到 Flutter 后,我现在正在尝试使用 Dart 作为我的主要服务器端语言。在应用程序和服务器上使用单一编码语言的生产力优势是相当可观的。为此,我设置了一个带有 Nginx 前端的服务器,它将所有动态 Web 请求代理到 Angel/Dart。服务器。
Angel 是一个写得非常好的软件包,我很快就写好了一个工作服务器。但是,为了拥有一个功能齐全的后端,我需要能够在我的服务器端 Dart 代码中同时使用 Redis 和 PostgreSQL。我正在使用 resp_client包来访问 Redis。我遇到的问题是 RespCommand.get是异步的。凭借我对 Dart 和 Angel 的新手知识,我无法找到通过 RespCommand.get
获取 Redis 键值的方法。在 Angel 路由处理程序中,然后以某种方式在它返回的响应中使用该值。
我的整个 Dart 后端服务器代码如下所示
import 'package:angel_framework/angel_framework.dart';
import 'package:angel_framework/http.dart';
import 'package:postgres/postgres.dart';
import 'package:resp_client/resp_client.dart';
import 'package:resp_client/resp_commands.dart';
class DartWeb
{
static Angel angel;
static AngelHttp http;
static RespCommands redis;
static PostgreSQLConnection db;
static init() async
{
angel = Angel();
http = AngelHttp(angel);
angel.get('/',rootRoute);
await prepareRedis();
await http.startServer('localhost',3000);
}
static prepareRedis() async
{
RespServerConnection rsc = await connectSocket('localhost');
RespClient client = RespClient(rsc);
redis = RespCommands(client);
}
static preparePostgres() async
{
db = new PostgreSQLConnection('serverurl',portNo,'database',username:'user',password:'password');
await db.open();
}
static void rootRoute(RequestContext req,ResponseContext res)
{
try
{
await redis.set('test','foobar',expire:Duration(seconds:10));
String testVal = await redis.get('test');
res.write('Done $testVal');
} catch(e) {res.write('++ $e ++');}
}
}
main() async {await DartWeb.init();}
如果我启动此服务器,然后通过我的网络浏览器访问它,我最终会收到一条 502 Bad Gateway 消息。不奇怪。
dart2native main.dart -o mainCompiled
返回错误 await can only be used in async...
信息。所以我尝试了
try
{
res.write('Before');
redis.set('test','foobar',expire:Duration(seconds:10)).then((bool done)
{
res.write('DONE $done');
});
res.write('After');
} catch(e) {res.write('++ $e ++');}
简单地打印出
BeforeAfter
在我的浏览器中使用 完成虽然通过 redis-cli
进行了快速测试,但位从未出现过显示 key test
实际上已经创建。我对 Dart 和 Angel 的了解还处于起步阶段,所以我想我在这里做错了什么。抛开所有细节,我的问题基本上是这些 -
async
并获取结果天使路线调度程序中的方法? dart2native
,正如我在这里使用的那样,它会有所帮助,但如果我能以某种方式在 VSCode 中获得运行错误报告,就像在本地构建 Flutter 应用程序时所做的那样,那就更好了。我怎样才能做到这一点 - 如果可能的话? 最佳答案
事实证明,Dart/Angel 并没有对路由处理程序的签名施加过分严格的约束。所以你可以很安全地声明一个像这样的路由处理程序
static Future<void> rootRoute(RequestContext req,ResponseContext res) async
{
try
{
res.write('!! Before ');
await redis.set('test','foobar',expire:Duration(seconds:10));
String test = await redis.get('test');
res.write('After $test !!');
} catch(e) {res.write('++ $e ++');}
}
通过简单地返回 Future 的路由,我们现在可以安全地在那里做任何我们喜欢的事情 - 包括调用其他异步方法:在这个实例中获取 Redis 键值。
关于dart - 如何使用 Angel 在服务器端 Dart 上获取 Redis 键值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61556440/