【问题标题】:How can I execute queries one after the other and extract value from 1st query and use it in the 2nd using expressJS?如何一个接一个地执行查询并从第一个查询中提取值并使用 expressJS 在第二个查询中使用它?
【发布时间】:2016-09-19 04:42:19
【问题描述】:
router.post("/application_action", function(req,res){
var Employee = req.body.Employee;
var conn = new jsforce.Connection({
  oauth2 : salesforce_credential.oauth2
});
var username = salesforce_credential.username;
var password = salesforce_credential.password;
    conn.login(username, password, function(err, userInfo, next) {
if (err) { return console.error(err); res.json(false);}
// I want this conn.query to execute first and then conn.sobject
    conn.query("SELECT id FROM SFDC_Employee__c WHERE Auth0_Id__c = '" + req.user.id + "'" , function(err, result) {
    if (err) { return console.error(err); }

    Employee["Id"] = result.records[0].Id;
 });
   //I want this to execute after the execution of above query i.e. conn.query
    conn.sobject("SFDC_Emp__c").update(Employee, function(err, ret) {
 if (err || !ret.success) { return console.error(err, ret);}
 console.log('Updated Successfully : ' + ret.id);
 });
});

我在上面提供了我的代码。我需要在conn.query 中修改Employee 并在conn.sobject 中使用它。我需要确保我的第一个查询在第二个之前执行,因为我从第一个获得价值并在第二个中使用。如果您知道如何完成此操作,请告诉我。

【问题讨论】:

  • 请正确缩进您的代码,以便我们阅读。
  • 好的。我想有人做到了。我希望你现在可以阅读。 @jfriend00
  • 您的代码显示的是路由处理程序,而不是中间件。中间件在哪里?
  • 缩进已经修好了,下次请自己修。

标签: node.js express asynchronous npm salesforce


【解决方案1】:

基于编辑问题的新答案

要根据另一个查询的结果执行一个查询,请将第二个查询放在第一个查询的完成回调中,如下所示:

router.post("/application_action", function (req, res) {
    var Employee = req.body.Employee;
    var conn = new jsforce.Connection({
        oauth2: salesforce_credential.oauth2
    });
    var username = salesforce_credential.username;
    var password = salesforce_credential.password;
    conn.login(username, password, function (err, userInfo, next) {
        if (err) {
            return console.error(err);
            res.json(false);
        }
        // I want this conn.query to execute first and then conn.sobject
        conn.query("SELECT id FROM SFDC_Employee__c WHERE Auth0_Id__c = '" + req.user.id + "'", function (err, result) {
            if (err) {
                return console.error(err);
            }

            Employee["Id"] = result.records[0].Id;
            //I want this to execute after the execution of above query i.e. conn.query
            conn.sobject("SFDC_Emp__c").update(Employee, function (err, ret) {
                if (err || !ret.success) {
                    return console.error(err, ret);
                }
                console.log('Updated Successfully : ' + ret.id);
            });
        });
    });
});

第一个查询结果有效的唯一地方是回调内部,否则,您无法知道这些异步结果何时实际可用和有效。

请注意,您的错误处理尚未完成,因为您在任何错误情况下都没有完成响应,即使在成功的情况下,您实际上还没有发送响应来完成请求。

原答案

首先,您的代码显示的是路由处理程序,而不是中间件。因此,如果您真的打算询问中间件,则必须展示您的实际中间件。不结束请求的中间件需要将next 声明为参数,然后在完成处理后调用它。这就是中间件之后继续处理的方式。

其次,您的console.log() 语句都将显示undefined,因为它们在包含设置这些变量的代码的conn.query() 回调之前执行。

conn.query() 是一个异步操作。它在未来的某个时候调用它的回调。同时,您的console.log() 语句会立即执行。

您可以通过将语句放入conn.query() 回调中来查看console.log() 的结果,但这可能只是您的问题的一部分。如果您解释了您真正想要完成的工作,那么我们可能会帮助您提供完整的解决方案。现在,您只是在询问有关有缺陷的代码的问题,而不是解释您要解决的更高级别的问题,因此您很难让我们为您的实际问题提供最佳答案。

仅供参考:

app.locals - 适用于您的应用的属性,可供所有请求处理程序使用。

res.locals - 范围为特定请求的属性,仅可用于处理此特定请求/响应的中间件或请求处理程序。

req.locals - 我在 Express 或 HTTP 模块中找不到任何文档。尽管没有记录在案,但对此的讨论基本上与 res.locals 的目的相同。

其他相关答案:

req.locals vs. res.locals vs. res.data vs. req.data vs. app.locals in Express middleware

Express.js: app.locals vs req.locals vs req.session

【讨论】:

  • 我同意你的观点,我知道这是问题所在,但不知道如何解决。好的。谢谢。我需要 Id 的值,因为我需要在它之后创建另一个 conn.query()。我知道它是异步的。我怎样才能让它工作?我尝试将整个第一个 conn 查询放在“if”语句中,但它仍然不起作用。 @jfriend00
  • @WaseemAbbas - 如果您尝试使用第一次的结果进行第二次conn.query(),请在您的问题中说明。正如我所说,只有当您告诉我们您要解决的真正问题时,我们才能为您提供最好的帮助。这样做的唯一方法是将第二个 conn.query() 放在第一个回调中。这是第一个结果有效的唯一地方。
  • 好的。我现在就去做。您认为问题的标题应该是什么?
  • @WaseemAbbas - 在您编辑它以说明您的实际问题之前,我仍然不知道您的问题是什么。如果是关于执行顺序异步操作,那么就让标题与此有关。
  • @jsfriend00 我已经编辑了这个问题,如果这次对你有意义,请告诉我。
【解决方案2】:

您错过了 javascript 中异步流程的基础知识。所有的回调都设置为事件循环的结束,所以conn.query的回调将在外部console.logs之后执行。 Here 是一篇很好的文章,解释了 JavaScript 中异步编程的基本概念。

【讨论】:

    猜你喜欢
    • 2020-03-09
    • 2018-03-15
    • 2014-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-01
    • 1970-01-01
    • 2015-07-23
    相关资源
    最近更新 更多