2015-12-09 2 views
0

У меня есть файл движущуюся утилиту на стороне сервера, , если целевой каталог не существует, ошибка Возвращается (по проводам):Node.js фс ошибка расширения

{errno: -2, 
code: 'ENOENT', 
path: 'uploads/workgroup/message.docx'} 

Кусок кода на серверная сторона:

Как вы видите, err.message игнорируется. Если я создаю новый объект ошибки, все в порядке:

fs.rename(oldpath,newpath, function(err) { 
    if(err) { 
    err.message = 'Target directory does not exist.'; 
    var err2 = new Error(); 
    err2.message = err.message; 
    err2.code = err.code; 
    err2.path = err.path; 
    err2.errno = err.errno; 
    return res.send(400, err2); 
    } 

Я понятия не имею, почему исходный объект ошибка не может быть изменен. Я пробовал console.log(util.inspect(err, {showHidden: true, depth: null}));, но это не дало много подсказки.

Любое объяснение очень ценится!

+0

MDN документация говорит, что вы не можете изменить прото Error: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/prototype – oshnaps

+0

@oshnaps - Две вещи: 1) OP не модифицирует прототип ошибки. Они просто добавляют «собственное» свойство к существующему объекту. и 2) То, что я прочитал в MDN, говорит: *** вы можете использовать прототип конструктора для добавления свойств или методов ко всем экземплярам, ​​созданным с помощью этого конструктора ***, – jfriend00

ответ

1

Когда объект ошибки создаются с помощью аргумента, переданного в конструктор в:

var e = new Error("Some Message Here"); 

создает объект Error, который имеет .message свойство, которое не перечислит. И, JSON.stringify(), который использует res.send(), не включает перечислимые свойства. И он остается неперечислимым, даже если вы назначаете другое значение этому свойству.

Но, если вы создаете объект Error без сообщения, переданного конструктору, а затем присвоить .message свойства это так:

var e = new Error(); 
e.message = "Some Message Here"; 

Затем .message свойство заканчивается как перечислим и будет включено в JSON.stringify(). Я понятия не имею, почему двигатель V8 делает это таким образом, но это так.


перечислимость собственности настраивается, так что вы можете изменить его, которое сделало бы его так res.send() бы включить его:

fs.rename(oldpath,newpath, function(err) { 
    if(err) { 
    Object.defineProperty(err, "message", {enumerable: true}); 
    err.message = 'Target directory does not exist.'; 
    return res.send(400, err); 
    } 

Или вы могли бы просто использовать свое собственное имя свойства, которое будет перечислимы по умолчанию:

fs.rename(oldpath,newpath, function(err) { 
    if(err) { 
    err.reason = 'Target directory does not exist.'; 
    return res.send(400, err); 
    } 
+0

Спасибо. Это ясное объяснение, и действительно 'Object.defineProperty' действительно исправляет json (который отправляется по проводу). Я отметил ваш ответ как принятый. – arcol

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