如何使用angel在服务器端dart上获取redis键值

50few1ms  于 2021-06-09  发布在  Redis
关注(0)|答案(1)|浏览(542)

将我的移动应用程序开发转移到flutter之后,我现在正在尝试使用dart作为我的主要服务器端语言。在应用程序和服务器上使用单一编码语言的生产率优势是相当可观的。为此,我设置了一个带有nginx前端的服务器,它将所有动态web请求代理到angel/dart服务器。
angel是一个非常好的软件包,我很快就有了一个可以工作的服务器。然而,为了拥有一个功能齐全的后端,我需要能够在服务器端dart代码中同时使用redis和postgresql。我正在使用resp\u client包访问redis。我遇到的问题是respcommand.get是异步的。我的新手都知道飞镖和天使,我找不到一个方法来获得一个redis键值通过 RespCommand.get 然后在返回的响应中使用该值。
我的整个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坏网关消息。不足为奇。 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 显示键 test 事实上是被创造出来的。
我对飞镖和天使的了解还处于初级阶段,所以我想我在这方面做得不对。除去所有细节我的问题基本上是这些-
我怎么打电话从你那里得到结果 async 天使路线调度器中的方法?
考虑到我正在本地windows机器上用vscode编辑dart代码,该机器访问ubuntu服务器上的相关dart文件,我失去了vscode dart插件提供的错误报告的好处。 dart2native ,正如我在这里使用的那样,这会有所帮助,但如果我能像在本地构建flutter应用程序时那样,在vscode中获得运行错误报告,那就更好了。如果可能的话,我该怎么做呢?

cbwuti44

cbwuti441#

事实证明,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 ++');} 
 }

由于路由只是返回一个未来,我们现在可以安全地在那里做任何我们喜欢的事情——包括调用其他异步方法:在本例中获取redis键值。

相关问题