dart - 如何使用 Angel 在服务器端 Dart 上获取 Redis 键值

标签 dart visual-studio-code redis nginx-reverse-proxy

将我的移动应用程序开发转移到 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 并获取结果天使路线调度程序中的方法?
  • 鉴于我正在本地 Windows 机器上的 VSCode 中编辑我的 Dart 代码,该机器访问我的 Ubuntu 服务器上的相关 dart 文件,我失去了 VSCode Dart 插件提供的错误报告的好处。 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/

    相关文章:

    flutter - Flutter Provider嵌套导航

    visual-studio-code - 尝试在 https ://pub. dartlang.org 查找包 ABC 时出现 TLS 错误

    visual-studio-code - VSCode Markdown 与 MathJax

    memory - Redis 需要多少空闲内存才能运行?

    firebase - 如何获得 flutter 朔迷离中的Firestore文档的证件编号?

    dart - 如何使用 Flutter 检测用户在我的屏幕上点击的位置?

    unit-testing - Flutter Widget 测试无法正确模拟不同的屏幕尺寸

    vue.js - Visual Studio Code 中的自动关闭括号不适用于 Vue 文件

    asp.net - 具有 redis 背板横向扩展的 Web 套接字 - 每个用户多个 redis channel 或所有用户一个 redis channel

    java - Laravel exec() 在队列作业中