2017-02-22 11 views
1

Я в настоящее время маршрут POST, определенной в приложении Экспресс Node.js, как так:Определение/Использовать обещание в маршруте Экспресс POST на Node.js

var locationService = require("../app/modules/locationservice.js"); 

app.post('/createstop', isLoggedIn, function(req, res) { 
    locationService.createStop(res, req.body); 
}); 

(на этот вопрос, пожалуйста, взять на себя маршрутизацию & дБ работает .. моя запись создается на форме представления, это ответ, который я борюсь с)

В locationservice.js классе я тогда в настоящее время

var models = require('../models'); 

exports.createStop = function(res, formData) { 

    models.location.build({ name: formData.name }) 
        .save() 
        .then(function(locationObj) { 
          res.json({ dbResult : locationObj }); 
         }); 

}; 

Так как вы можете видеть, мой маршрут вызывает экспортируемую функцию CreateStop, которая использует постоянный слой Sequelize для вставки записи в асинхронном режиме, после чего я могу придерживаться результата на ответ в обетованной then()

Так что на данный момент это работает только путем передачи объекта ответа в метод locationservice.js, а затем устанавливает res.json в then(). Это неоптимально для меня в отношении моих классов обслуживания, и я тоже не чувствую себя хорошо.

То, что я хотел бы сделать, это «обработать» мой метод createStop как обещание/с обратным вызовом, поэтому я могу просто вернуть новый объект местоположения (или ошибку) и обработать его в вызывающем методе - поскольку в будущем использование этого метода может иметь контекст/параметр ответа для передачи/заполнения.

Поэтому в маршруте я хотел бы сделать что-то подобное:

var locationService = require("../app/modules/locationservice.js"); 

app.post('/createstop', isLoggedIn, function(req, res) { 
    locationService.createStop(req.body) 
     .then(dataBack) { 
      res.json(dataBack); 
     }; 
}); 

Это значит, я мог бы назвать createStop от другого, где в будущем и среагировать на ответ в этого обработчика обещание. Но это в настоящее время вне меня. Я провел тщательное исследование, но некоторые индивидуальные экспертные материалы по моему конкретному делу были бы наиболее ценными.

ответ

1

createStop Оберните функцию с обещанием так:

exports.createStop = function(res, formData) { 
    return new Promise(function(resolve, reject) { 
     models.location.build({ name: formData.name }) 
        .save() 
        .then(function(locationObj) { 
          resolve({ dbResult : locationObj }); 
        }); 

        //in case of error, call reject(); 
    }); 
}; 

Это позволит использовать .then после createStop маршрутизатора.

+0

Вы не могли бы заменить ES6 => со старой школы разметки? Я не могу получить эту работу в своем коде, и это меня бросает! –

+1

Уверен, обновлено .. –

4

Ваш locationservice.js может выглядеть, что

exports.createShop = function(data){ 
    // here I have used create instead of build -> save 
    return models.location.create(data).then(function(location){ 
     // here you return instance of saved location 
     return location; 
    }); 
} 

И тогда ваш метод post() должен быть как ниже

app.post('/createstop', isLoggedIn, function(req, res){ 
    locationService.createShop(req.body).then(function(location){ 
     // here you access the location created and saved in createShop function 
     res.json(location); 
    }).catch(function(error){ 
     // handle the error 
    }); 
}); 
+0

это сработало. Спасибо. Я не думал о возврате всей функции. –

+0

Чтобы выполнить метод '.then()' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' – piotrbienias

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

  • Нет связанных вопросов^_^