Создать REST API из асинхронных данных в Javascript / Node - PullRequest
0 голосов
/ 05 ноября 2019

У меня есть маршрут, который должен быть REST API метрик, которые у меня есть в базе данных (это журналы использования os). На данный момент API возвращает только json заголовки данных, например:

{"success":true,"message":"all os logs in database"}

Метод API

const selectOsJSON = () => {
    let os_JSONlogs = { "success":true , "message":"all os logs in database" };
    let arrayLogs = [];

    dbMethods.osModel.findAll( {raw : true, order: [['id', 'DESC']]} ).then( (data) => {
        for(let entry of data)
        {
            arrayLogs.push(entry);
        }
        os_JSONlogs.data = arrayLogs;
        console.log('REST API DATA:', os_JSONlogs);
    } ).catch( (error) => console.log(chalk.redBright('Erreur de promesse REST API OS logs')) ); //need method to adequately shoot the JSON data.

    return os_JSONlogs;
};


module.exports.selectOsJSON = selectOsJSON;

Пример маршрута сервера:

app.get('/osjson', (request, response) => { //Should return JSON logs in REST API format

    response.json(apiMethods.selectOsJSON());
    response.end('oslog route - end');

});

Как вы видите, response.json напрямую добавляет данные, прежде чем сможет успешно выбрать записи, которые я хотел бы отобразить. Я попытался использовать асинхронное ожидание, с которым у меня мало опыта, или создать новое Обещание, такое как const selectOsJSON = new Promise(//), но безуспешно.

Чего я хочу добиться, это отправить response.json после разрешения данныхиз запроса findAll, так что я могу иметь API рабочего отдыха. Пожалуйста, наставьте меня, как решить эту проблему. Спасибо

Ответы [ 3 ]

1 голос
/ 05 ноября 2019

Вы работаете с Обещанием здесь, поэтому вы определенно можете использовать async / await

const selectOsJSON = async () => {
  const os_JSONlogs = { success:true , message:"all os logs in database" };
  try {
    os_JSONlogs.data = await dbMethods.osModel.findAll({
      raw: true,
      order: [['id', 'DESC']]
    });
  } catch (e) {
    // You probably want to catch Mongo-specific errors here
    console.log(chalk.redBright('Erreur de promesse REST API OS logs')) );
    os_JSONlogs.success = false;
    os_JSONlogs.message = 'Erreur de promesse REST API OS logs';
  }
  return os_JSONlogs;
};

Затем вы можете использовать тот же шаблон для ответа

app.get('/osjson', async (req, res) => {
  const osJson = await apiMethods.selectOsJSON();
  res.json(osJson);
})
0 голосов
/ 05 ноября 2019

Вот как это исправлено и работает API:

osmetrics.js

const selectOsJSON = async () => {
    let os_JSONlogs = { "success":true , "message":"all os logs in database" };
    let arrayLogs = [];

    const data = await dbMethods.osModel.findAll( {raw : true, order: [['id', 'DESC']]} );

    for(let entry of data)
    {
        arrayLogs.push(entry);
    }
    os_JSONlogs.data = arrayLogs;

    return os_JSONlogs;
};

module.exports.selectOsJSON = selectOsJSON;

server.js

app.get('/osjson', (request, response) => { //Should return JSON logs in REST API format

    apiMethods.selectOsJSON().then( data => {
        response.json(data);
    }).catch( e => console.log(e));

});

Улов не обязателен. Ответ имеет объект JSON, как и предполагалось. Надеюсь, это кому-нибудь поможет

0 голосов
/ 05 ноября 2019
const selectOsJSON = async () => {
let os_JSONlogs = { "success":true , "message":"all os logs in database" };
let arrayLogs = [];

const data = await dbMethods.osModel.findAll( {raw : true, order: [['id', 'DESC']]} );
for(let entry of data){
    arrayLogs.push(entry);
}
os_JSONlogs.data = arrayLogs;
console.log('REST API DATA:', os_JSONlogs);

return os_JSONlogs;
};
module.exports.selectOsJSON = selectOsJSON;

Пожалуйста, проверьте этот код.

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