【问题标题】:How to put callback into res.json in express.js如何在 express.js 中将回调放入 res.json
【发布时间】:2018-09-17 12:30:17
【问题描述】:

我需要在我的 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);
    }
  });
};

【问题讨论】:

  • @KolaCaine 但我的函数不返回承诺,我该如何使用 .then ?
  • 请发布您的功能

标签: javascript node.js express callback


【解决方案1】:

首先,让函数返回一个 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);
  });
});

【讨论】:

  • 如果它帮助您解决问题,请接受答案:-)
  • 但在这种情况下可以使用没有承诺的回调吗?
  • 是的,但是会稍微复杂一点...您的目标是不支持 Promise 的节点版本吗?
  • 我大约一个月前开始学习 JS,我想尽我所能尝试一切)
  • 我将对帖子进行编辑,解释如何使用回调来做到这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-30
  • 2016-09-15
  • 1970-01-01
  • 2020-07-24
  • 1970-01-01
相关资源
最近更新 更多