2016-08-07 2 views
0

У меня проблема в моем текущем приложении ExpressJS. Я использую обычные функции для переноса различных маршрутов в приложении, и когда возникает ошибка, я могу легко использовать return next (err) для выхода из функции (return) и вызвать обработчик ошибок (next (err)).Возврат ошибки из обещания в ExpressJS

Но что мне делать, если есть несколько сложенных функций, выполнение которых я хочу предотвратить?

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

Спасибо за любые предложения!

Edit: я сломался какой-то код, чтобы описать проблему:

// This function is an expressJS route 
function doSomeStuff (req, res, next) {  
    var mongooseObj = new mongooseModel ({}); 
    mongooseObj.save (function (err) { 
     if (err) 
      return next (new Error ("whatever")); 
     // The line above returns from the callback, the expressJS error-handler handles the error, but then the code execution continues below 
    }); 

    // Function continues here 
} 
+0

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

+0

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

+0

Нет, я имею в виду бросить исключение, чтобы вырваться из цепи ** и ** поймать его. Но без кода я боюсь, что обсуждать нечего. –

ответ

1

Конечно, это не прерывает поток вашей программы! Вы не возвращаетесь с doSomeStuff, но из анонимного обратного вызова, который вы перешли на save. Эта функция вызывается только после процедура сохранения выполнена, и она не остановить ваш поток программы.

Mongoose supports promises для save и так же. Таким образом, правильный способ, чтобы решить вашу проблему является:

// This function is an expressJS route 
function doSomeStuff (req, res, next) {  
    var mongooseObj = new mongooseModel ({}); 
    var p = mongooseObj.save(); 
    p.then(function() { 
     // Other stuff that needs to be done *after* save succeeds 
    }) 
    .catch(function(err) { next (new Error ("whatever")); }) 
} 
+1

Я знал проблему, похоже, я не совсем ясно это сказал.Я просто не знал, как это решить. Это, кажется, работает очень хорошо, я использовал .then (null, function (err)). Я попробую переключиться на .catch. Спасибо за вашу помощь. – NikxDa

+0

Это хорошо слышать :) Может быть, дополнительная разработка может помочь другим людям, которые могут путать возвращение с обратного вызова! –

+0

Я обновлю свое первоначальное сообщение как можно скорее. – NikxDa

0

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

Как я хотел бы попробовать переписать это обещание будет:

function doSomethingStuff (req, res, next) { 

     return new Promise (resolve, reject) { 

     var mongooseObj = new mongooseModel ({}); 
     mongooseObj.save (function (err) { 
      if (err) 
      reject (new Error ("whatever")); 

      else {resolve("something")} 
     }); 
    } 


    doSomethingStuff(params) 

     .then(//return from function) 
     .catch (function (err) { return err;}    

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