Anjali
Anjali

Reputation: 31

Callback is not a function -manage asynchronous call Node js

I am reading files from ftp using the code below.

var JSFtp = require("jsftp");
var config = require('./config.json');
var FtpService = function () {};
// Connect to FTP
 var Ftp = new JSFtp({
  host: config.ftp.host,
  port: config.ftp.port,
  user: config.ftp.user, 
  pass: config.ftp.pass
});

FtpService.prototype.getFTPDirectoryFiles = function (callback) {
    Ftp.list(config.ftp.FilePath, function(err, res) {
        if(err){
          console.log('File Listing Failed', err);
          callback(null,err);
          return;
        }
        else{
            console.log(res);
            callback(null,res);
        }
    });
};


FtpService.prototype.closeFtp = function () {
  console.log('Disconnect to FTP');
};



module.exports = new FtpService();

Now i include this ftp service js file in my index.js as

var ftp = require('./ftpservice.js');
ftpfiles = ftp.getFTPDirectoryFiles();
console.log(ftpfiles);

getFTPDirectoryFiles returns the list of file. But if i call it via index.js i get undefined ftpfiles. This is because of the asynchronous nature of node js. so i thought of adding callback but I am getting the error Callback is not defined in function FtpService.prototype.getFTPDirectoryFiles

Upvotes: 0

Views: 116

Answers (3)

Indent
Indent

Reputation: 4967

1 Don't change args order to call callback. (replace callback(null,err); and callback(null,res); by callback(err,res);)

2 You need define a specifc function (your callaback) an give it to ftp.getFTPDirectoryFiles().

var JSFtp = require("jsftp");
var config = require('./config.json');
var FtpService = function () {};
// Connect to FTP
 var Ftp = new JSFtp({
  host: config.ftp.host,
  port: config.ftp.port,
  user: config.ftp.user, 
  pass: config.ftp.pass
});

FtpService.prototype.getFTPDirectoryFiles = function (callback) {
    Ftp.list(config.ftp.FilePath, function(err, res) {
        if(err){
          console.log('File Listing Failed', err);
          callback(err, res);
          return;
        }
        else{
            console.log(res);
            callback(err, res);
        }
    });
};

FtpService.prototype.getFTPDirectoryFilesSimplify = function (callback) {
    // no console.log, but very more simple !
    Ftp.list(config.ftp.FilePath, callback);
};


FtpService.prototype.closeFtp = function () {
  console.log('Disconnect to FTP');
};

and then :

var ftp = require('./ftpservice.js');
ftpfiles = ftp.getFTPDirectoryFiles(function(err,res){
    // do your specifc job here using err and res
});
console.log(ftpfiles);

Upvotes: 0

Muhammad Faizan
Muhammad Faizan

Reputation: 1789

You need to pass a callbackfunction in your function getFTPDirectoryFiles();

var ftp = require('./ftpservice.js');
var ftpFiles;
function setFtpFiles(err, res) {
  if (err) throw err;
  ftpFiles = res; // to use "ftpFiles" variable later
  console.log(res);
}

ftp.getFTPDirectoryFiles(setFtpFiles);

Upvotes: 0

jfriend00
jfriend00

Reputation: 707158

In this line:

ftpfiles = ftp.getFTPDirectoryFiles()

you are not passing the callback that that function requires and are trying to use a return value that the function does not return.

You need to do something like this:

var ftp = require('./ftpservice.js');
ftp.getFTPDirectoryFiles(function(err, ftpfiles) {
    if (err) {
        console.log(err);
    } else {
        console.log(ftpfiles); 
    }
});

Upvotes: 1

Related Questions