我目前在Express Node.js应用程序中定义了一个POST路由,如下所示:
var locationService = require("../app/modules/locationservice.js");
app.post('/createstop', isLoggedIn, function(req, res) {
locationService.createStop(res, req.body);
});
(对于这个问题,请假设& db中的路由工作..我的记录是在表单提交时创建的,它是我正在努力的响应)
在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
方法作为promise / with a callback所以我可以返回新的location对象(或错误)并在调用方法中处理它 - 因为此方法的未来使用可能有响应上下文/参数传入/被填充。
因此在路线上我会做更多的事情:
var locationService = require("../app/modules/locationservice.js");
app.post('/createstop', isLoggedIn, function(req, res) {
locationService.createStop(req.body)
.then(dataBack) {
res.json(dataBack);
};
});
这意味着,我可以从将来的其他地方调用createStop
并对 承诺处理程序中的响应做出反应。但这目前超出了我的范围。我已经完成了我的尽职调查研究,但对我的具体案例的一些个人专家意见将非常感激。
答案 0 :(得分:5)
您的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
});
});
方法应如下所示
import Contacts
var contact = CNContact()
var contactStore = CNContactStore()
let foundContact = getContactFromID("94AAD3B1-E9E1-48C9-A796-F7EC1014230A")
func getContactFromID(contactID: String) -> CNContact {
AppDelegate.getAppDelegate().requestForAccess { (accessGranted) -> Void in
if accessGranted {
let predicate = CNContact.predicateForContactsWithIdentifiers([contactID])
let keys = [CNContactGivenNameKey, CNContactFamilyNameKey, CNContactEmailAddressesKey, CNContactPhoneNumbersKey, CNContactImageDataKey, CNContactImageDataAvailableKey]
var contacts = [CNContact]()
var message: String!
let contactsStore = AppDelegate.getAppDelegate().contactStore
do {
contacts = try contactsStore.unifiedContactsMatchingPredicate(predicate, keysToFetch: keys)
if contacts.count == 0 {
message = "No contacts were found matching the given name."
}
}
catch {
message = "Unable to fetch contacts."
}
if message != nil {
dispatch_async(dispatch_get_main_queue(), { () -> Void in
Utility.showAlert(nil, message: message)
})
} else {
dispatch_async(dispatch_get_main_queue(), { () -> Void in
self.contact = contacts[0]
print("self.contact: \(self.contact)")
})
}
}
}
return self.contact
}
答案 1 :(得分: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();
});
};
这将允许您在路由器中的createStop之后使用.then
。