【问题标题】:Define/Use a promise in Express POST route on node.js在 node.js 上的 Express POST 路由中定义/使用承诺
【发布时间】:2017-07-12 14:32:58
【问题描述】:

我目前在 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 持久层异步插入一条记录,之后我可以将结果粘贴到 promise 的响应中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,并对 that 承诺处理程序中的响应做出反应。但这目前超出了我的范围。我已经完成了尽职调查,但我们将非常感谢一些专家对我的具体案例的个人意见。

【问题讨论】:

    标签: node.js express promise


    【解决方案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

    【讨论】:

    • 你能不能用老式的标记替换 ES6 => ?我无法在我的代码中完成这项工作,这让我很失望!
    【解决方案2】:

    您的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
        });
    });
    

    【讨论】:

    • 这很奏效。谢谢。我没想过要返回整个函数。
    • 为了在路由解析器中对createShop方法执行.then(),需要从locationservice.js - createShop函数返回一个promise
    猜你喜欢
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-10
    • 1970-01-01
    • 2017-03-23
    • 1970-01-01
    相关资源
    最近更新 更多