Действительно перепутан с JS async (вызов 2 API) - PullRequest
0 голосов
/ 27 апреля 2018

Итак, простое объяснение того, что я делаю. Во-первых, я принимаю запрос GET от конечного пользователя. Во-вторых, я передаю (я сейчас делаю GET-запрос) параметр из запроса get в асинхронную функцию, которая возвращает адрес электронной почты пользователя на основе этого параметра (по сути, это тщеславный URL. «Боб» против «Роберт Ричардсон»).

В-третьих, я делаю еще один запрос GET ко второй системе, которая возвращает JSON-файл, содержащий различные подробности о пользователе.

Я знаю, что выноски работают нормально, потому что я могу запустить node index.js с функцией, где я вручную передаю нужную мне информацию, и она возвращает желаемые результаты. Но когда я запускаю свой сервер nodejs и пытаюсь ответить на входящий запрос GET (я тестирую, определенно не живу), я получаю очень странные результаты ...

Вот что я сейчас пытаюсь заставить работать: //server.js const express = require ('express'); const bodyParser = require ('body-parser'); const app = express (); постоянный порт = 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 голосов
/ 27 апреля 2018

вы смешиваете асинхронные и обещания, этого было бы избежать. Ваша проблема в том, что функция getUserInfo является асинхронной, но она не имеет части «ожидание», она не ожидает «разрешения» или возврата, поэтому она ничего не возвращает или «не определена», потому что вы присваиваете это электронное письмо в «let email = getdata». GetUserInfo (псевдоним);» Вы можете использовать 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);
        });
    });
}
0 голосов
/ 27 апреля 2018

Вам нужно getReturn, чтобы вернуть обещание, сгенерированное вызовом getEmailFromPromise. Поскольку app.get использует обратный вызов, а не обещание, вам сначала нужно явно преобразовать его в обещание - в этом случае мало что делает при выполнении getReturn асинхронного.

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, вам придется явно преобразовать ее, чтобы вернуть обещание а также:

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 что-то обещать, если вы просто решите это немедленно. (и второй аргумент, который вы предоставляете обещанию в getEmail, 1000, не имеет никакого смысла)

Просто верните само обещание:

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