2017-02-22 29 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