如何一个接一个地执行查询并从第一个查询中提取值并在第二个查询中使用 expressJS 使用它?

How can I execute queries one after the other and extract value from 1st query and use it in the 2nd using expressJS?

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 中使用它。我需要确保我的第一个查询在第二个之前执行,因为我从第一个获取价值并在第二个中使用。如果您知道如何完成此操作,请告诉我。

基于对问题的编辑的新答案

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

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 - 特定请求范围内的属性,仅适用于参与处理此特定 request/response.

的中间件或请求处理程序

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

其他相关回答:

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

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