2015-08-31 6 views
1

мог бы вы мне помочь undesrtand причины, почему я получаю «неопределенным, если не функция» сообщения об ошибке !:неопределенный не является функция-Node.js

Вот мой код:

function write(dest, data, cb) { 
      var safe_write = function (cb) { 
       var tmpname = tempFile(dest) 
       fs.writeFile(tmpname, data, function (err) { 
        if (err) 
         return cb(err) 
        renameTmp(tmpname, dest, cb) 
       }) 
      } 

      safe_write(function (err) { 
       if (err && err.code === 'ENOENT') { 
        mkdirp(Path.dirname(dest), function (err) { 
         if (err) 
          return cb(err) 
         safe_write(cb) 
        }) 
       } else { 
        cb(err);// The error message is coming from here! 
       } 
      }) 
     } 

Я звоню его где-то вроде этого:

module.exports.write_json = function (name, value, cb) { 
    var foo = nano.db.use('foo'); 
    value['_id'] = value['name']; 
    foo.get(value['name'], function (err, body) { 
     if (err && err.error == "not_found") { 
      foo.insert(value, function (err, response) { 
       write(name, JSON.stringify(value, null, '\t'), cb(err)) 
      }) 
     } else { 
      var data = lodash.merge(body, value); 
      foo.atomic("update", "inplace", value['name'], data, function (err, response) { 
       write(name, JSON.stringify(data, null, '\t'), cb(err)) 
      }) 
     } 
    }); 
} 
+1

Это означает, что '' cb' является undefined'. – Pointy

+0

Ты имеешь в виду, где я его называю? –

+1

Как вы называете 'write()'? Возможно, вам не хватает аргумента, или указанный аргумент не определен. – MinusFour

ответ

1

при вызове write(), вы передаете cb(err)

write(name, JSON.stringify(data, null, '\t'), cb(err)) 

Если cb является функцией, то cb(err)вызывает функцию и возвращаемое значение то, что передается write(). Вот откуда у вас undefined.

Это не совсем ясно из вашего кода, но вероятно вы должны просто передать cb:

write(name, JSON.stringify(data, null, '\t'), cb) 
+0

wow cb это работает, но все же я не знаю, почему?!?! –

+0

Вы гениальный человек! Я пытаюсь понять, почему ?! Все еще я не знаю почему ?! –

+0

@ user3399784, когда вы упоминаете функцию и следуете за ней с помощью '(xxx)', это означает, что «сейчас вызывайте эту функцию». Именно так работают JavaScript-выражения. 'cb (err)' означает "вызывать функцию, на которую ссылается' cb', передавая значение 'err'. Это не отличается от окружающего вызова функции 'write()', см.? – Pointy

Смежные вопросы