在node.js

时间:2017-02-22 13:46:01

标签: node.js express promise

我目前在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并对 承诺处理程序中的响应做出反应。但这目前超出了我的范围。我已经完成了我的尽职调查研究,但对我的具体案例的一些个人专家意见将非常感激。

2 个答案:

答案 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