TypeError:"回调"参数必须是一个函数

时间:2016-12-22 22:33:49

标签: javascript node.js express twitter callback

所以我按照指南使用twit将图像上传到twitter w节点。

这是我的代码

    function upload_random_image(){
  console.log('Opening an image...');
  var image_path = path.join(__dirname, '/random_cam/' + random_cam()),
      b64content = fs.readFileSync(image_path, { encoding: 'base64' });

  console.log('Uploading an image...');

  T.post('media/upload', { media_data: b64content }, function (err, data, response) {
    if (!err){
      console.log('ERROR');
      console.log(err);
    }
    else{
      console.log('Uploaded an image!');

      T.post('statuses/update', {
        media_ids: new Array(data.media_id_string)
      },
        function(err, data, response) {
          if (!err){
            console.log('Error!');
            console.log(err);
          }
          else{
            console.log('Posted an image!');
          }
        }
      );
    }
  });
}

也许我错过了回调函数的一些东西,我知道如果必须是一个函数,但我无法理解为什么我的函数不起作用。

错误:

throw new TypeError('"callback" argument must be a function');

完整代码:

var Twit = require('twit')

var fs = require('fs'),
    path = require('path'),
    Twit = require('twit'),
    config = require(path.join(__dirname, 'config.js'));


var T = new Twit(config);

function random_cam(){
  var random_pic = [
    '1.jpg',
    '2.jpg',
    '3.jpg'
  ];
  return random_pic[Math.floor(Math.random() * random_pic.length)];
}


function upload_random_image(){
  console.log('Opening an image...');
  var image_path = path.join(__dirname, '/random_cam/' + random_cam()),
      b64content = fs.readFileSync(image_path, { encoding: 'base64' });

  console.log('Uploading an image...');

  T.post('media/upload', { media_data: b64content }, function (err, data, response) {
    if (err){
      console.log('ERROR');
      console.log(err);
    }
    else{
      console.log('Uploaded an image!');

      T.post('statuses/update', {
        media_ids: new Array(data.media_id_string)
      },
        function(err, data, response) {
          if (err){
            console.log('Error!');
            console.log(err);
          }
          else{
            console.log('Posted an image!');
          }
        }
      );
    }
  });
}

setInterval(
  upload_random_image(),
  10000
);

完成错误:

Opening an image...
Uploading an image...
timers.js:414
    throw new TypeError('"callback" argument must be a function');
    ^

TypeError: "callback" argument must be a function
    at exports.setInterval (timers.js:414:11)
    at Object.<anonymous> (/Users/imac/test/server.js:72:1)
    at Module._compile (module.js:571:32)
    at Object.Module._extensions..js (module.js:580:10)
    at Module.load (module.js:488:32)
    at tryModuleLoad (module.js:447:12)
    at Function.Module._load (module.js:439:3)
    at Module.runMain (module.js:605:10)
    at run (bootstrap_node.js:420:7)
    at startup (bootstrap_node.js:139:9)
    at bootstrap_node.js:535:3

3 个答案:

答案 0 :(得分:6)

你声明setInterval()不正确,正确的方法是

setInterval(function(){upload_random_image()},10000);

var Twit = require('twit')

var fs = require('fs'),
    path = require('path'),
    Twit = require('twit'),
    config = require(path.join(__dirname, 'config.js'));


var T = new Twit(config);

function random_cam(){
  var random_pic = [
    '1.jpg',
    '2.jpg',
    '3.jpg'
  ];
  return random_pic[Math.floor(Math.random() * random_pic.length)];
}


function upload_random_image(){
  console.log('Opening an image...');
  var image_path = path.join(__dirname, '/random_cam/' + random_cam()),
      b64content = fs.readFileSync(image_path, { encoding: 'base64' });

  console.log('Uploading an image...');

  T.post('media/upload', { media_data: b64content }, function (err, data, response) {
    if (err){
      console.log('ERROR');
      console.log(err);
    }
    else{
      console.log('Uploaded an image!');

      T.post('statuses/update', {
        media_ids: new Array(data.media_id_string)
      },
        function(err, data, response) {
          if (err){
            console.log('Error!');
            console.log(err);
          }
          else{
            console.log('Posted an image!');
          }
        }
      );
    }
  });
}

setInterval(function(){
     upload_random_image()
},10000);

答案 1 :(得分:5)

背景

setInterval expects a function作为第一个参数。

在您的代码中

setInterval(upload_random_image(), 10000);

upload_random_image正在被调用,什么也不返回。

解决方案

就像提到的Karthikeyan一样,为了仍然调用upload_random_image,最好的办法是将其包装在一个函数中: setInterval(() => upload_random_image(), 10000)

答案 2 :(得分:0)

不要按照 sophia.onion 的建议将您的函数包装在另一个匿名函数中。只需删除括号,以便传递函数引用而不是执行的函数。

问题:这会执行函数 upload_random_image 而不是将其作为参数传递。

setInterval(upload_random_image(), 10000);

解决方案:传递函数引用而不是执行。

setInterval(upload_random_image, 10000);