回调不是函数错误[Nodejs]

时间:2017-12-06 14:24:27

标签: node.js callback

我有以下代码

var getUrl = function(callback) {
  ref.once('value')
    .then(function(snap) {
      let article_url = snap.val();
      console.log(article_url);
      callback(null, article_url); // I dont want to throw an error, so I pass null for the error argument
    });
};

var getImage = function(err, data, callback) {
  //if (err) throw err; // Check for the error and throw if it exists.
  textapi.extract({
    url: data,
    best_image: true
  }, function(error, response) {
    if (error === null) {
      //console.log(response.image);
      if (response.image == null || response.image == "") {
        image = "https://www.wefornews.com/wp-content/uploads/2017/01/news-3.jpg"
      } else {
        image = response.image;
      }
    }
  });
  callback(null, image); // Otherwise proceed as usual.
};

var updateDatabase = function(err, data) {
  //if (err) throw err; // Check for the error and throw if it exists.
  refupdate.update ({
    "Article_Image_URL": data
  });
  console.log('success'); // Otherwise proceed as usual
};

getUrl(getImage);
getImage(updateDatabase);

但我在第callback is not a function

时收到错误callback(null, image);

问题是,如果我删除updateDatabase函数,那么我没有错误。但是当它在代码中时,我得到上面提到的错误。 有人可以告诉我可能导致此错误的原因是什么?

3 个答案:

答案 0 :(得分:0)

const updateDatabase = async (value) => {
  try {
    let snap = await ref.once(value);
    let article_url = snap.val();
    let image = await textapi.extract({
      url: article_url,
      best_image: true
    });
    if (image==='') {image = 'https://www.wefornews.com/wp-content/uploads/2017/01/news-3.jpg'}
    refupdate.update({
      "Article_Image_URL": article_url
    });
  } catch (err) {
    throw err;
  }
}

答案 1 :(得分:0)

因为您未在此次通话getImage(updateDatabase);(最后一行)上提供任何回调?

答案 2 :(得分:0)

当您致电getUrl(getImage)时,getImage功能会作为callback参数传递给getUrlgetUrl然后调用此callback参数,传递两个参数。

callback(null, article_url)

getImage需要三个参数

var getImage = function(err, data, callback)

所以callback函数中的getImage未定义,并且当您尝试将undefined作为函数调用时

callback(null, image)

...您收到了callback is not a function错误。

<强>解决方案

您需要嵌套回调,以便使用正确的参数以正确的顺序调用函数。

getUrl(function (err, article_url) {
  getImage(err, article_url, function (err, image) {
    updateDatabase(err, image);
  });
});

这也可以简化,因为您想在updateDatabase完成后直接致电getImage

getUrl(function (err, article_url) {
  getImage(err, article_url, updateDatabase);
});

此外,在你的getImage函数中,callback函数在textapi.extract函数完成之前被调用,这可能不是你想要的。

之前

var getImage = function(err, data, callback) {
  textapi.extract({
    url: data,
    best_image: true
  }, function(error, response) {
    /* code */
  });
  callback(null, image); // This will get called immediately, without waiting for textapi.extract
};

var getImage = function(err, data, callback) {
  textapi.extract({
    url: data,
    best_image: true
  }, function(error, response) {
    /* code */
    callback(null, image); // Callback moved here, so it gets called after textapi.extract completes
  });
};