mscdex / node-ftp

An FTP client module for node.js
MIT License
1.13k stars 246 forks source link

Optional parameter should behave as if was omitted when supplied with undefined or null #201

Open dreamdevil00 opened 6 years ago

dreamdevil00 commented 6 years ago

For example, in the method list, both path and useCompression are optional, but when I invoke the method by ftp.list(void (0), true, ()=> {}), it fetches the list of directory 'undefined', instead, Ithink that it should fetch the current working directory list.

I met this problem when I use typescript, since the param callback is the last one and is necessary, I couldn't find a better way to handle it.

If I place the callback in the first, then it breaks the node-style callback This is my code

readdir(directory?: any, useCompression?: any,
    callback?: (err: Error | null, list?: any[]) => void) {
    this.getConnection((err, ftp) => {
      if (err) {
        return callback && callback(err);
      }
      if (ftp) {
        ftp.listSafe(directory, useCompression, (error: Error, list: Ftp.ListingElement[]) => {
          if (error) {
            return  callback && callback(error);
          }
          if (typeof list === 'undefined') {
            return;
          }
          const files = [];
          for (let i = 0; i < list.length; i++) {
            const file = list[i];
            if (file.name === '.' || file.name === '..') {
              continue;
            }
            let path = directory;
            if (path.substr(-1) !== '/') {
              path += '/';
            }
            files.push({
              size: file.size,
              filename: file.name,
              isDirectory: file.type === 'd',
              path: path + file.name,
            });
          }
          return callback && callback(null, files);
        });
      }
    });
  }

If I invoke it by readdir(true, ()=> {}) It fetched the directory undefined

How can I solve this problem?

Please help me, thanks a lot