当前位置: 首页 > 面试题库 >

Express Node.JS-接收Redis回调,执行Promise

杨晟
2023-03-14
问题内容

我有一个Node /
Express路由功能,该功能在另一个模块中执行Redis调用。我想在一个节点模块中执行复杂的Redis功能,并发送一个简单的回调,说路由模块成功了。Redis调用会执行,但是我无法执行任何同步功能,即使从Redis调用中检索甚至是一个简单的true值。这是我的Redis函数:

doctorDB.js

var addDoctor = function addDoctor(id, doc){

    var fields = Object.keys(doc.fields);

    return client.multi()
        .sadd("Doctors", id)
        .hmset(id, "lastName", doc.lastName, "firstName", doc.firstName)
        .hmset(id, "email", doc.email, "university", doc.university, "work", doc.work)
        .sadd(id + ":fields", fields)
        .exec(function(err, replies){
            console.log("It's in this");
            if (doc.middleName){
                console.log("Now here");
                client.hset(id, "middleName", doc.middleName);
                return true;
            } else {
                console.log("Or here");
                return true;
            }                       
        }); 
};

一切都为此目的而努力。现在,我希望将回调发送到Express路由器,以将响应发送到客户端。我希望它采用同步功能的形式,并且我已经尝试使用Q和Async进行许多操作,但是没有任何效果。因此,要么A.我对Promise函数不完全了解,要么B.我不完全将值返回到另一个模块。任何帮助,将不胜感激。

作为参考,这是快速路由器端的许多失败尝试:

routes.js

app.post('/addDoctorInfo',  ensureLoggedIn('/login'), function(req, res, next){

    // function getThis(req){
    //  var deferred = Q.defer();

    //  doctorDB.addDoctor(req.body.id, req.body.doc).then(function(response){
    //      deferred.resolve(response);
    //  }, function(err){
    //      console.log(err);
    //      return deferred.resolve(err);
    //  });
    //  return deferred.promise;
    // }

    // var x = getThis(req);
    // console.log(x);

    doctorDB.addDoctor(req.body.id, req.body.doc).then(function(x){
        console.log(x);
    }).catch(function(err){
        console.log(err);
    }).finally(function(){
        console.log("We made it!");
    });


    // function sendMsg(info){
    //  console.log(info);
    //  res.send({success: true});
    // }
    // async.waterfall([
    //  doctorDB.addDoctor(req.body.id, req.body.doc),
    //  sendMsg(info)
    // ], function(err){
    //  console.log(err)
    // });

    // var DBCALL = doctorDB.addDoctor(req.body.id, req.body.doc);

    // Q.fcall(DBCALL).then(function(x){
    //  return console.log(x);
    // }).catch(function(err){
    //  console.log(err);
    // });
});

问题答案:

我想通了。我使用Q库代替了client.multi()。exec()来执行所有功能。这样可以干净地执行所有redis post命令,然后让我检索信息。

在routes.js文件中,我只有一小段代码。一切都在doctorDB.js文件中执行。

routes.js

app.post('/addDoctorInfo', ensureLoggedIn('/login'), function(req, res, next){
        return doctorDB.addDoctor(req.body.id, req.body.doc, req, res, next);
});

doctorDB.js

var addDoctor = function addDoctor(id, doc, req, res, next){
    var fields = Object.keys(doc.fields);

    function middleName(id, doc){
        if (doc.middleName){ return client.hset(id, "middleName", doc.middleName); }
        else { return; }
    }

    return Q.all([Q.ninvoke(client, 'sadd', 'Doctors', id),
                    Q.ninvoke(client, 'hmset', id, "lastName", doc.lastName, "firstName", doc.firstName, "email", doc.email, "university", doc.university, "work", doc.work),
                    Q.ninvoke(client, 'sadd', id + ':fields', fields),
                    middleName(id, doc)]).then(function(x){
                        return getInfo(id, req, res, next);;
                    }, function (err) { res.status(404); });
};

这将传递给函数getInfo(),该函数将响应发送到客户端:

var redisHGetAll = Q.nbind(client.hgetall, client);

var getInfo = function getInfo(id, req, res, next){
    return redisHGetAll(id).then(function(x){
        return findByMatchingProperties(x);
    }, function (err) { res.status(404); }).then(function(){
        return client.smembers(id + ':fields', function(err, reply){
            data['fields'] = reply;
            res.setHeader('Content-Type', 'application/json');
            res.end(JSON.stringify(data));
        });
    }, function (err) { res.status(404); })
};

function findByMatchingProperties(x) {
    for (var y in x){
        checkData(y, x[y]);
    }

    function checkData(y, z){
        for (var d in data){
            if (d === y){
                data[d] = z;
            }
        }
    }
}

var data = {
    lastName: null,
    firstName: null,
    middleName: null,
    email: null,
    university: null,
    work: null,
    fields: null
};


 类似资料:
  • 接收订单状态回调 说明 当订单状态发生改变时,滴滴出行会通过回调服务将这些事件通知接入方。使用此功能需开启回调服务,关于如何设置接收消息请见回调服务配置。 当接入方收到回调后,需要重新调用订单详情接口,拉取最新的订单状态和信息,然后做相应处理 支持场景 订单中间状态流转 司机接单(等待接驾) 改派中 乘客迟到 乘客迟到计费 司机迟到 司机到达 计费中(行程中) 订单终态通知 正常

  • 问题内容: 有什么技巧可以基于Redis延迟任务执行(即计划)? 也许一些聪明的方法可以将BLPOP延迟给定的秒数? 问题答案: 您可以使用名称中带有时间成分的多个LIST环。作为时间成分,您可以采用当前秒(0-59)。 您总是将任务添加到当前秒的列表中。要获得作业,请仅在保证内容早于给定秒数的那些列表上执行BLPOP(低超时)。 如果您在多个主机上工作,则必须注意时钟是同步的(NTP)。

  • 我有两个不同的方面类来计算测试程序执行的非静态方法调用的数量。第一个方面统计“调用”连接点上的方法: 第二个方面统计“执行”连接点上的方法: 是一个静态方法在计数器类。 小测试程序的方法调用次数相同。但是当我用一个更大的程序改变测试程序时,第二个方面类(带有执行切入点)中的方法调用数量比带有调用切入点的方面类中的方法调用数量多。这是合理的,因为呼叫连接点不会挑出用超级发出的呼叫,因此不会计算它们。

  • 问题内容: 以下是我用来设置状态的代码。 即使成功创建了数据库,也无法调用,因为它始终是未定义的。 我试过了: 但是它仍然失败,尝试使用和使用,仍然没有运气。 我该如何解决? 问题答案: 您需要将正确的(类上下文)与回调方法绑定在一起,然后只有您才能访问类的属性和方法。 可能的解决方案: 1- 使用 箭头功能 ,如下所示: 2- 或与一起使用,如下所示: 您使用的方式也将起作用,保存方法内部的引用

  • 我的场景是这样的:我们将用户指向一个表单,他们在其中填写数据(3DSecure),然后发布,网站然后发布对回调URL的响应——这个响应就是我想要捕获的。可以获取标题,但不能获取内容(为什么,谷歌?)。我尝试了这个链接,它可以获取用户发送的POST数据。有什么方法可以使用Javascript捕获正在接收到我选择的回调的POST数据吗? 我看到这篇5年前的帖子,该男子将回复发回服务器,然后从手机上获取

  • 我的问题可能会引起一些混乱,所以请先看说明。找出我的问题可能会有帮助。我会在问题的后面添加我的代码(也欢迎任何关于我的代码结构/实现的建议)。感谢您事先提供的任何帮助! 我的问题: 有什么用途?我的代码会输出没有这句话的结果。如果我加上这句话,就会出现一个例外: - 描述:编程新手。最近我需要使用Flink批处理来处理一些数据(分组数据、计算标准差等)。然而,我到了一个点,我需要输出两个数据集。结