2017-02-14 2 views
0

Я пытаюсь узнать nodejs и наткнуться на эту ошибкуTypeError: обратный вызов не является функцией в nodejs

TypeError: обратного вызова не является функцией

, когда я пытаюсь вызвать сервер с помощью этой команды ,

локон http://localhost:8090/albums.json

и вот код для моего server.js

var http = require('http'), 
 
    fs = require('fs'); 
 

 
function load_album(album_name, callback) { 
 
    fs.readdir("albums/", +album_name, (err, files) => { 
 
    if (err) { 
 
     if (err.code == "ENOENT") { 
 
     callback(make_error("no_such_album", "That album doesn't exist")); 
 
     } else { 
 
     callback(make_error("can't load album", "The server is broken")); 
 
     } 
 
    } else { 
 
     //callback(null, files); 
 
     var only_files = []; 
 
     var path = 'albums/${album_name}/'; 
 

 
     var iterator = (index) => { 
 
     if (index == files.length) { 
 
      var obj = { 
 
      short_name: album_name, 
 
      photos: only_files 
 
      }; 
 
      callback(null, obj); 
 
      return; 
 
     } 
 

 
     fs.stat(path + files[index], (err, stats) => { 
 
      if (!err && stats.isFile()) { 
 
      only_files.push(files[index]); 
 
      } 
 
      iterator(index + 1); 
 
     }); 
 
     }; 
 
     iterator(0); 
 
    } 
 
    }); 
 
} 
 

 

 
function handle_incoming_request(req, res) { 
 
    console.log("incoming request: " + req.method + " " + req.url); 
 

 
    if (req.url == '/albums.json') { 
 
    load_album((err, albums) => { 
 
     if (err) { 
 
     res.writeHead(500, { 
 
      "Content-Type": "application/json " 
 
     }); 
 
     res.end(JSON.stringify({ 
 
      code: "cant_load_albums", 
 
      message: err.message 
 
     })); 
 
     } else { 
 
     var output = { 
 
      error: null, 
 
      data: { 
 
      albums: albums 
 
      } 
 
     }; 
 
     res.writeHead(200, { 
 
      "Content-Type": "application/json" 
 
     }); 
 
     res.end(JSON.stringify(output) + "\n"); 
 
     } 
 
    }); 
 
    } else if (req.url.substr(0, 7) == '/albums' && req.url.substr(req.url.length - 5) == '.json') { 
 
    //user is requesting contents of album 
 
    load_album(req.url.substr(7, req.url.length - 12), (err, photos) => { 
 
     if (err) { 
 
     res.writeHead(500, { 
 
      "Content-type": "application/json" 
 
     }); 
 
     res.end(JSON.stringify(err)); 
 
     } else { 
 
     var output = { 
 
      error: null, 
 
      data: { 
 
      photos: photos 
 
      } 
 
     }; 
 
     res.writeHead(200, { 
 
      "Content-Type": application/json 
 
     }); 
 
     res.end(JSON.stringify(output) + "\n"); 
 
     } 
 
    }); 
 
    } else { 
 
    res.writeHead(404, { 
 
     "Content-type": "application/json" 
 
    }); 
 
    res.end(JSON.stringify({ 
 
     code: "no_such_page", 
 
     message: "No such page" 
 
    })); 
 
    } 
 
} 
 
var s = http.createServer(handle_incoming_request); 
 
s.listen(8090);

вы можете сказать мне, что случилось с моим кодом, который я получил, рассказывающий об ошибке me callback - это не функция?

благодаря хотя

более отформатированный код, то вы можете пойти здесь https://jsfiddle.net/02dbx6m9/

+1

Пожалуйста, переформатируйте свой код так, чтобы его можно было прочитать. Его гораздо труднее увидеть, когда код не отформатирован правильно – Gab

+0

Я просто поместил код в jsfiddle, так как jsfiddle имеет лучший способ форматировать код для удобного чтения. –

+0

Вы отправляете только один параметр в load_album вместо двух в первом вызове, так что обратный вызов всегда будет неопределенным. – Sheepy

ответ

1

var http = require('http'), 
 
    fs = require('fs'); 
 

 
function load_album(album_name, callback) { 
 
    fs.readdir("albums/", +album_name, (err, files) => { 
 
    if (err) { 
 
     if (err.code == "ENOENT") { 
 
     callback(make_error("no_such_album", "That album doesn't exist")); 
 
     } else { 
 
     callback(make_error("can't load album", "The server is broken")); 
 
     } 
 
    } else { 
 
     //callback(null, files); 
 
     var only_files = []; 
 
     var path = 'albums/${album_name}/'; 
 

 
     var iterator = (index) => { 
 
     if (index == files.length) { 
 
      var obj = { 
 
      short_name: album_name, 
 
      photos: only_files 
 
      }; 
 
      callback(null, obj); 
 
      return; 
 
     } 
 

 
     fs.stat(path + files[index], (err, stats) => { 
 
      if (!err && stats.isFile()) { 
 
      only_files.push(files[index]); 
 
      } 
 
      iterator(index + 1); 
 
     }); 
 
     }; 
 
     iterator(0); 
 
    } 
 
    }); 
 
} 
 

 

 
function handle_incoming_request(req, res) { 
 
    console.log("incoming request: " + req.method + " " + req.url); 
 

 
    if (req.url == '/albums.json') { 
 
    load_album("ALBUM NAME", (err, albums) => { 
 
     if (err) { 
 
     res.writeHead(500, { 
 
      "Content-Type": "application/json " 
 
     }); 
 
     res.end(JSON.stringify({ 
 
      code: "cant_load_albums", 
 
      message: err.message 
 
     })); 
 
     } else { 
 
     var output = { 
 
      error: null, 
 
      data: { 
 
      albums: albums 
 
      } 
 
     }; 
 
     res.writeHead(200, { 
 
      "Content-Type": "application/json" 
 
     }); 
 
     res.end(JSON.stringify(output) + "\n"); 
 
     } 
 
    }); 
 
    } else if (req.url.substr(0, 7) == '/albums' && req.url.substr(req.url.length - 5) == '.json') { 
 
    //user is requesting contents of album 
 
    load_album("Album Name", req.url.substr(7, req.url.length - 12), (err, photos) => { 
 
     if (err) { 
 
     res.writeHead(500, { 
 
      "Content-type": "application/json" 
 
     }); 
 
     res.end(JSON.stringify(err)); 
 
     } else { 
 
     var output = { 
 
      error: null, 
 
      data: { 
 
      photos: photos 
 
      } 
 
     }; 
 
     res.writeHead(200, { 
 
      "Content-Type": application/json 
 
     }); 
 
     res.end(JSON.stringify(output) + "\n"); 
 
     } 
 
    }); 
 
    } else { 
 
    res.writeHead(404, { 
 
     "Content-type": "application/json" 
 
    }); 
 
    res.end(JSON.stringify({ 
 
     code: "no_such_page", 
 
     message: "No such page" 
 
    })); 
 
    } 
 
} 
 
var s = http.createServer(handle_incoming_request); 
 
s.listen(8090);

Вы забыли передать альбом параметра имя в методе load_album. Вот почему параметру album_name присваивается фактический обратный вызов, а параметр обратного вызова остается неопределенным.

+0

хорошо спасибо, вы дали большие объяснения, и теперь я могу это решить. –

1

Вот основная причина вашего вопроса:

load_album((err, albums) => { 
    // ... 
}); 

Сигнатура функции требует двух параметров, но вы только передаете первый:

function load_album(album_name, callback) {} 

В этом случае, после вызова, callback будет неопределенным, но вы пытаетесь рассматривать его как вызываемый. Вот более succint пример того, как воспроизвести ошибку:

function foo(bar, baz) { 
 
    baz() 
 
} 
 

 
foo(() => {})

+0

, и где я должен добавить другие параметры? Я этого не понимаю. –