真的与JS异步混淆(调用2 API)

时间:2018-04-27 01:37:21

标签: javascript node.js get promise async-await

这是对我正在做的事情的简单解释。首先,我接受最终用户的GET请求。其次,我将一个(我现在正在发出GET请求)参数从get请求传递给异步函数,该异步函数根据参数返回用户的电子邮件地址(本质上是一个虚荣网址。" Bob&# 34; vs" Robert Richardson")。

第三,我正在向更多的GET请求发送到第二个系统,该系统返回包含关于用户的不同花絮的JSON文件。

我知道标注工作正常,因为我可以使用我手动传递所需信息的函数运行node index.js,并返回所需的结果。但是,当我启动我的nodejs服务器,并尝试响应传入的GET请求(我测试,绝对不是直播)时,我得到了非常奇怪的结果......

这就是我现在想要的工作:     //server.js     const express = require(' express');     const bodyParser = require(' body-parser');     const app = express();     const port = 8000;

app.use(bodyParser.urlencoded({
  extended: true
}));

require('./app/routes')(app, {});
app.listen(port, () => {
  console.log('test is listening on port :: ' + port);
});

//routes.js
const getdata = require('./getData '); //contains function for GET request one to convert param to email


async function getReturn(app, db) {
  app.get('/getDataFrom/:alias', (req, res) => {
    const alias = req.params.alias;
    console.log('alias : ' + alias);
    getEmailFromPromise(alias);

  });


}

async function getEmailFromPromise(alias) {
  console.log('getting email');
  let output = await getEmail(alias);
  console.log('output :: ' + output);
  // return output;
}

function getEmail() {
  return new Promise(resolve => {
    let email = getdata.getUserInfo(alias);
    resolve(email);
  }, 1000);
}

值得注意的是,JS和Node并不是我常用的代码,但是我需要为我正在帮助的项目提供帮助。我可以得到简单的例子,但不是我的请求。

传入GET:localhost:8000 / getDataFrom / bob

以上内容将返回以下内容:

test is listening on port :: 8000
alias : rrichardson
getting email
output :: undefined   //I am wanting this to log after I actually get the email
email found :: robert.richardson@company.com   //I do get this back, but out of order. The undefined above should also be this

另一个文件,如果有帮助(正确导出):

//this is callout one getData 

async function getUserInfo(alias){
client.connect();
client.query('select email, firstname, lastname from salesforce.user WHERE 
alias = \''+ alias + '\'', (err, res) => {
if (err) console.log('err :: ' + err);
// console.log(res.rows);
   client.end();
   var email = res.rows[0].email;
   if(email != null){
     console.log('email found :: ' + email);
     return email;
    } 
    else return 'No Email Found';
  });
}

显然我遗漏了我的凭据,但是当我将特定数据传入其中时,最后一个js文件的工作正常。再次,只是在尝试响应传入我的GET请求时出现问题。我真的很感激任何帮助清除这一点。我很确定我可以得到第二个GET请求,如果我能得到一些帮助来弄清楚第一个。

谢谢!

2 个答案:

答案 0 :(得分:1)

您需要getReturn才能返回getEmailFromPromise来电产生的承诺。由于app.get使用的是回调而不是承诺,因此您必须先将其明确转换为承诺 - 在这种情况下,getReturn异步不会有太大用处。< / p>

function getReturn(app, db) {
  return new Promise((resolve) => {
    app.get('/getDataFrom/:alias', (req, res) => {
      const alias = req.params.alias;
      console.log('alias : ' + alias);
      getEmailFromPromise(alias)
        .then(resolve);
    });
  });
}

另一个问题是,getUserInfo 使用回调而非承诺 - 您无法将其转换为async函数,您可以必须明确地将其转换为返回Promise:

function getUserInfo(alias){
  return new Promise((resolve, reject) => {
    client.connect();
    client.query('select email, firstname, lastname from salesforce.user WHERE 
                 alias = \''+ alias + '\'', (err, res) => {
      if (err) {
        console.log('err :: ' + err);
        reject(err);
      }
      // console.log(res.rows);
      client.end();
      var email = res.rows[0].email;
      if(email != null){
        console.log('email found :: ' + email);
        resolve(email);
      } 
      else resolve('No Email Found');
    });
  });
}

如果您希望以下行仅在承诺解决后运行,您还需要使用await来使用承诺:

function getEmail() {
  return new Promise(resolve => {
    let email = await getdata.getUserInfo(alias);

但如果您只是立即解决问题,那么对await某事作出承诺并没有多大意义。 (你在getEmail1000中提供给承诺的第二个论点,没有任何意义)

只需返回承诺本身:

function getEmail() {
  return getdata.getUserInfo(alias);
}

答案 1 :(得分:1)

你正在混合异步和承诺,这将是避免。 你的问题是函数getUserInfo是异步但它没有&#34; await&#34;部分,它不是在等待&#34;解决&#34;或返回所以它什么都不返回或&#34;未定义&#34;因为你在&#34;中将电子邮件分配给电子邮件let email = getdata.getUserInfo(别名);&#34;你可以在这一步中使用primse,有些像这样:

function getUserInfo(alias){
    return new Promise(function(resolve, reject){
        client.connect();
        client.query('select email, firstname, lastname from salesforce.user WHERE alias = \''+ 
                 alias + '\'', (err, res) => {
            if (err) reject('err :: ' + err);
            // console.log(res.rows);
            client.end();
            var email = res.rows[0].email;
            if(email != null){
                console.log('email found :: ' + email);
                resolve(email);
            } 
            else reject('No Email Found');
        });
    }
}

并称之为:

function getEmail() {
    return new Promise(resolve => {
        getdata.getUserInfo(alias).then(function(email){
            resolve(email);
        });
    });
}