我应该如何编写简单的顺序 GET

How should I write simple sequential GETs?

本文关键字:顺序 GET 简单 何编写 我应该      更新时间:2023-09-26

Node.js 和 redis 看起来很热,但我被烧伤了。我无法优雅地克服看似非常简单的任务:

给定 3 个数字,检查前两个是否大于 10。如果是,请打印第三个数字。

我确实用这个相当滑稽的脚本完成了这个任务:

var http = require("http");
var redis = require("redis");
client = redis.createClient();
http.createServer(function(request, response) {
    client.SET("key1", "11");
    client.SET("key2", "9");
    client.SET("key3", "3");
    response.writeHead(200, {"Content-Type": "text/plain"});
    response.write("Hello'n'n");
    client.GET("key1", function(err, reply) {
        response.write(reply + "'n'n");
        if(parseInt(reply) > 10) {
          client.GET("key2", function(err, reply) {
              response.write(reply + "'n'n");
              if(parseInt(reply) > 10) {
                client.GET("key3", function(err, reply) {
                    response.write(reply + "'n'n");
                    response.end();
                    client.end();
                  });
              } else {
                response.end();
                client.end();
              }
            });
        } else {
          response.end();
          client.end();
        }
      });
  }).listen(8000);

我注意到的几件事是:

  • 每次我想要一个新的 GET 时都需要嵌套吗?
  • response.end()需要打电话到某个地方才能出现write。如何避免在else块中重复它们?

然后我尝试了这种查询数据库的方式:

http.createServer(function(request, response) {
client.SET("key1", "11");
client.SET("key2", "9");
client.SET("key3", "3");
var key1 = 0;
var key2 = 0;
var key3 = 0;
response.writeHead(200, {"Content-Type": "text/plain"});
response.write("Hello'n'n");
client.GET("key1", function(err, reply) {
        response.write(reply + "'n'n");
        key1 = parseInt(reply);
    });
client.GET("key2", function(err, reply) {
        response.write(reply + "'n'n");
        key2 = parseInt(reply);
    });
client.GET("key3", function(err, reply) {
        response.write(reply + "'n'n");
        key3 = parseInt(reply);
    });
response.write(key1 + "'n'n");
response.write(key2 + "'n'n");
response.write(key3 + "'n'n");
response.end();
client.end();

经过一些阅读和思考,我的解释是代码在异步 GET 返回之前到达 response.write,然后关闭响应,因此内部写入永远不会发生。至少我从第一个示例中注意到可以轻松调用 SET,但我不知道(似乎并不重要)它们是否真的按该顺序设置。

所以,也许我正在做一些不适合节点和 redis 的事情。我一定错过了一些基本和明显的东西。我需要做什么才能升级?

或者告诉我我必须回到PhpMyAdmin:(

看看异步它可以帮助你组织你的代码https://github.com/caolan/async希望这有帮助