невозможно получить данные из функции await / async - PullRequest
2 голосов
/ 07 марта 2019

Я пробую gtmetriks api с помощью nodejs. у меня есть файл index.js, где я обрабатываю входящие запросы, тогда у меня есть файл gtmetriks.js, чтобы делать запросы к API.

Проблема в том, что я не знаю, как настроить его для получения данных в index.js только после того, как gtmetriks.js завершит запрос и получит данные.

index.js:

const gtmetriks = require('../gtmetrix/gtmetrix');

router.get('/api/gtmetriks', (req, res) => {
        const result = gtmetriks()
        console.log(result);  
        res.send(result);    
    })

gtmetrriks.js:

const api = async () => {
console.log('starting');

// Run test from London with Google Chrome
const testDetails = {
    url: 'http://google.com/',
    location: 2,
    browser: 3
};
const test = await gtmetrix.test.create(testDetails);
console.log('test: ', test);

const data = await gtmetrix.test.get(test.test_id, 5000);
console.log('data: ', data);

return data    
}

module.exports = api;

Результат в браузере: {}. Я предполагаю, что это значение «результата», потому что это значение, которое он получает при инициализации.

Что я должен делать?

Ответы [ 2 ]

3 голосов
/ 07 марта 2019

Ваша api функция имеет значение async и поэтому возвращает Promise, что вам нужно ожидать в вашем обработчике маршрута:)

Попробуйте

router.get('/api/gtmetriks', async (req, res) => {
    const result = await gtmetriks()
    console.log(result);  
    res.send(result);    
})
2 голосов
/ 07 марта 2019

Как я вижу, вы объявляете const api как функцию async, поэтому, когда вы вызываете любую функцию async, пишите await, если перед этой функцией. Поэтому он будет ждать, пока функция разрешит все обещания и получит результат.

router.get('/api/gtmetriks', async (req, res) => {
    const result = await gtmetriks()
    console.log(result);  
    res.send(result);    
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...