Вызов асинхронной (Promise) функции из функции синхронизации с Express и Node - PullRequest
0 голосов
/ 28 октября 2018

Из базового экспресс-файла index.js есть ли способ вызвать асинхронную функцию из вызова функции синхронизации ( getData здесь)?

const express = require('express');
const bodyParser = require('body-parser');

// function which calls a Promise
const getData = require('./getAsyncData.js');

const app = express();

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

app.get('/authors/:lang', (req, res) => { 

  const lang = req.params.lang; 
  const getResults = getData( lang );
  res.json(getResults);

});

Вот какМодуль getAsyncData выглядит следующим образом:

// getAsyncData.js

const getAsyncData = async function () {

  try {

    // Questionable method of recovering the lang parameter here.
    const lang = (arguments.length) ? arguments[0].toUpperCase() : null;

    // Connect to the database
    const connection = await db.connect(true);

    // Get the data
    const {authors, books} = await connection.load();

    // Join results and filter it
    const filtered_results = GetAuhtorsBooks(authors, books, lang);

    // Send it back 
    return filtered_results;

  } catch(e) {

    return null;

  }

};

module.exports = getAsyncData;

Но в index.js вызов getData неизбежно происходит перед вызовами внутри модуля getAsyncData.getData дает undefined.Кажется, единственный способ получить результат - сделать что-то подобное в index.js:

app.get('/authors/:lang', async (req, res, next) => {

  try {
    const lang = req.params.lang;
    const testResult = await runTests(lang);
    res.json(testResult);

  } catch (e) {

    //this will eventually be handled by the error handling middleware
    next(e) 

  }

});

. Есть ли способ получить тот же результат без реализации функции async / await в app.get (…)?

Большое спасибо за любые советы.

Ответы [ 2 ]

0 голосов
/ 28 октября 2018

Любая функция async всегда возвращает Обещание.Express поддерживает обработчики маршрутов, возвращающие обещания.Вы можете использовать этот код:

const express = require('express');
const bodyParser = require('body-parser');

// function which calls a Promise
const getData = require('./getAsyncData.js');

const app = express();

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

app.get('/authors/:lang', async (req, res) => { 

  const lang = req.params.lang; 
  const results = await getData( lang );
  res.json(results);

});
0 голосов
/ 28 октября 2018

Вы можете использовать API нижнего уровня, равный .then()

app.get('/authors/:lang', (req, res, next) => { 

  const lang = req.params.lang; 
  getData( lang )
    .then(getResults => res.json(getResults));
    .catch(next);

});

Но в этот момент вам лучше использовать async, особенно когда ваш код достигнет точки, где простополучить одну точку данных и вернуть ее недостаточно, и вам нужно делать больше вещей.

Вам все равно придется вручную вызывать next() или res.error(...) независимо от того, ваша функция больше не будет генерировать ошибку или ошибкусинхронно, когда участвуют Обещания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...