Как выкинуть ошибки из действия в Сенека? - PullRequest
0 голосов
/ 02 ноября 2018

Я работаю над простым диспетчером задач в SenecaJS и пытаюсь понять, как правильно выкидывать ошибки из действия. Скажем, у меня есть действие, которое загружает задачу из хранилища данных, а задача не существует ...

Ниже приведен метод из моего плагина:

/**
 * Retrieves a task based on a task ID.
 *
 * @param  {number} args.taskID The UUID of the task to be retrieved.
 * @param  {function} done A callback function which is called upon retrieval. The
 * first argument is an error response; the second is the task.
 * @returns {Task|undefined} A task if one exists; otherwise undefined.
 */
this.get = function(args, reply) {
  var task = this.make('task')
    task.load$( args.taskID, function(err, task) 
      if(!task || err) {
      reply( {code:404, message:`Task ${args.taskID} not found.`} );
    } else {
      reply( task );
    }
  });
};

А это юнит-тест:

test('Returns "undefined" for non-existant tasks', (fin) => {
  var seneca = testSeneca(fin);
  var id = "I-don't-exist";
  seneca
    .act(
      { domain: 'task', action: 'get', taskID: id },
      function(err, result) {
        expect(result).not.toBeNull();
        expect(result.code).toBe(404);
        fin();
      }
    );
});

Код ниже работает, но, как вы можете видеть, я действительно игнорирую обратный вызов err и оцениваю результат, чтобы увидеть, является ли это ошибкой или нет. В документации Seneca использует следующее, чтобы выдать ошибку:

ответ (новая ошибка (404));

или

выбросить новую ошибку (404);

Но когда я это делаю, процесс завершается, и модульное тестирование не проходит. Кроме того, обратный вызов err всегда кажется нулевым, даже если я отвечаю двумя объектами.

Есть ли более правильный способ возврата ошибок, использующих обратный вызов err?

1 Ответ

0 голосов
/ 26 июля 2019

Возможно, вы используете экземпляр определения плагина для вызова нормальных действий - ошибки в этом случае всегда фатальны, поскольку означают, что инициализация не удалась.

Попробуйте

this.get = function(args, reply, meta) {
  console.log(meta)

, чтобы увидеть, если fatal === true.

Пожалуйста, включите код для вашего seneca.add звонка, чтобы мы могли видеть, так ли это.

...