2017-02-22 56 views
1

我目前在一個Express的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方法,然後在then()中設置res.json。對我來說,這對我的服務班來說是次優的,而且也不合適。

我希望能夠做的是將我的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

爲了在路由解析器的'createShop'方法上執行'.then()',必須從'locationservice.js - createShop'函數返回一個promise – piotrbienias