Как поместить обратный вызов в res.json в express.js - PullRequest
0 голосов
/ 17 сентября 2018

Мне нужно вызвать функцию асинхронного обратного вызова, которая возвращает объект в моем Express.js, но я не знаю, как!

app.get('/first', function (req, res, next) {

res.json(//put my async callback function here ?);
});

Функция:

const reqObj = () => {
  request(`isdb.pw/${url}`, function(err, res, body) {
    if (!err) {
      const $ = cheerio.load(body);
      var name = $('meta[name="description"]').attr('content');
      var story = $('meta[property="og:video:url"]').attr('content');
      return {
        name,
        story
      };
    } else {
      console.log(err);
    }
  });
};

1 Ответ

0 голосов
/ 17 сентября 2018

Сначала сделайте так, чтобы функция возвращала Promise, затем вы можете использовать .then для него:

const reqObj = () => {
  return new Promise((resolve, reject) => {
    request(`isdb.pw/${url}`, function(err, res, body) {
      if (!err) {
        const $ = cheerio.load(body);
        var name = $('meta[name="description"]').attr('content');
        var story = $('meta[property="og:video:url"]').attr('content');
        resolve({
          name,
          story
        });
      } else {
        reject(err);
      }
    });
  });
};

После этого вызовите асинхронную функцию и запустите res.json(), когда получите данные:

app.get('/first', function (req, res, next) {
  reqObj().then(data => {
    res.json(data);
  }).catch(err => console.log(err)); 
});

res.json() принимает только объекты в качестве параметра


Вот решение с обратными вызовами

const reqObj = (callback) => { // <-- add callback parameter here
    request(`isdb.pw/${url}`, function(err, res, body) {
      if (!err) {
        const $ = cheerio.load(body);
        var name = $('meta[name="description"]').attr('content');
        var story = $('meta[property="og:video:url"]').attr('content');
        callback(null,{ // <-- call callback function without err, but with data
          name,
          story
        });
      } else {
        callback(err); // <-- call callback just with data
      }
    });
  });
};


app.get('/first', function(req, res, next) {
  reqObj((err, data) => { // <-- pass callback function
    if(err) return console.log(err) // <-- check for error
    res.json(data);
  });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...