Как мне скопировать Javascript Error без ссылки? - PullRequest
2 голосов
/ 16 октября 2019

Я хочу скопировать Javascript Error без ссылки.

Пример:

const error1 = new Error('error1');
const error2 = error1;

error2.message = 'error2';

console.log(error1);
console.log(error2);

Вывод:

Error: error2
    at evalmachine.<anonymous>:1:16
    at Script.runInContext (vm.js:133:20)
    at Object.runInContext (vm.js:311:6)
    at evaluate (/run_dir/repl.js:133:14)
    at ReadStream.<anonymous> (/run_dir/repl.js:116:5)
    at ReadStream.emit (events.js:198:13)
    at addChunk (_stream_readable.js:288:12)
    at readableAddChunk (_stream_readable.js:269:11)
    at ReadStream.Readable.push (_stream_readable.js:224:10)
    at lazyFs.read (internal/fs/streams.js:181:12)

Error: error2
    at evalmachine.<anonymous>:1:16
    at Script.runInContext (vm.js:133:20)
    at Object.runInContext (vm.js:311:6)
    at evaluate (/run_dir/repl.js:133:14)
    at ReadStream.<anonymous> (/run_dir/repl.js:116:5)
    at ReadStream.emit (events.js:198:13)
    at addChunk (_stream_readable.js:288:12)
    at readableAddChunk (_stream_readable.js:269:11)
    at ReadStream.Readable.push (_stream_readable.js:224:10)
    at lazyFs.read (internal/fs/streams.js:181:12)

Когда я изменяю error2, тогда error1 также изменится. тогда я попробовал lodash clone функцию. Но, к сожалению, вместо этого он возвращает объект, а не экземпляр Error. Есть ли способ, чтобы я мог скопировать Error без ссылки и вернуть экземпляр Error без изменения stack или других свойств по умолчанию?

Ответы [ 3 ]

1 голос
/ 16 октября 2019

Вы можете попробовать ввести некоторые важные свойства вручную:

const error1 = new Error('error1');
const error2 = new error1.constructor(error1.message);

if (error1.stack) {
  error2.stack = error1.stack;
}

if (error1.code) {
  error2.code = error1.code;
}

if (error1.errno) {
  error2.errno = error1.errno;
}

if (error1.syscall) {
  error2.syscall = error1.syscall;
}

error2.message = 'error2';

console.log(error1);
console.log(error2);
0 голосов
/ 16 октября 2019

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

function copyError(err, newMessage) {
    var newErr = new Error(newMessage);

    newErr.stack = err.stack;
    // copy other properties
}

var newErr = copyError(e, "New message");

Однако я недумаю, что это отличный подход.

Другой вариант - сделать что-то вроде того, что делает .NET - создать новую ошибку и поместить исходную ошибку в свойство этой ошибки:

var newErr = new Error("New message");
newErr.innerError = originalError;

Недостатком здесь является то, что для проверки этих ошибок необходимо проверить наличие свойства .innerError и использовать его соответствующим образом.

0 голосов
/ 16 октября 2019

Вы можете попробовать новый синтаксис деструктуризации ES6

const error2 = {
    ...error1
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...