【问题标题】:return promise value from controller从控制器返回承诺值
【发布时间】:2016-07-27 06:36:57
【问题描述】:

我正在使用 Node、Express 和 Objection.js。 我的文件结构是:

 ->Project Folder
   ->Controllers(folder)
     ->agenciaController.js
   ->Models(folder)
     ->Agencia.js
   ->index.js 

在我的 index.js 代码中是:

var Knex = require('knex');
var express = require("express");
var app = express();
var knexConfig = require('./knexfile');
var Model = require('objection').Model;

var knex = Knex(knexConfig.development);
Model.knex(knex);

var reqAgenciaController = require('./Controllers/agenciaController');
var agenciaController = new reqAgenciaController();
app.get("/agencias", function(req, res) {
    var respuesta = agenciaController.getAgencias();
    console.log("log3: "+respuesta);
});   

而我的 agenciaController.js 是:

var Agencia = require('../Models/Agencia');    
module.exports = agenciaController;    
function agenciaController() {
    this.getAgencias = function() {
        var retValue = "retvalue";
        listaAgencias = [];

        Agencia.query()
            .then(function(agencias) {
                listaAgencias = agencias;
                console.log("log1: "+ listaAgencias);
            });
        console.log("log2: "+listaAgencias);
        return listaAgencias;
    }
}

我的问题是当我运行代码时,我得到了

log2:
log3: undefined
log1: [object Object, object Object].

但我需要:

log1: [object Object, object Object].
log2: [object Object, object Object].
log3: [object Object, object Object].

我的问题是:是否可以将listaApuestas从控制器返回到index.js,并在promise中获得值?

【问题讨论】:

  • 你不了解 promises 是如何工作的,请调查this article。

标签: node.js express promise


【解决方案1】:

agenciaController.getAgencias() 应该使用您选择的承诺库进行推广。

我推荐使用bluebird。

诀窍在于,如果一个 Promise 存在于另一个 Promise 中,你需要稍微改变你的结构。

agenciaController.js 示例

var Promise = require("bluebird");

agenciaController = {
    getAgencias: function(callback) {
        this.queryAsync().then(function(respuesta) {
            console.log("log2: "+ respuesta);
            callback(false, respuesta);
        })
    },
    query: function(callback) {
        console.log("log1", {});
        callback(false, { respuesta: "respuesta" })
    }
}

Promise.promisifyAll(agenciaController);

module.exports = agenciaController; 

示例 app.js

var AgenciaController = require('./agenciaController');

agenciaController.getAgenciasAsync().then(function(respuesta) {
    console.log("log3: " + respuesta);
});

这将输出:

log1 {}
log2: [object Object]
log3: [object Object]

【讨论】:

    【解决方案2】:

    感谢您的帮助!最后研究更多关于承诺并遵循他们的例子,解决了这个问题。 这是我用来解决问题的代码

    我的agenciaController.js:

    var Agencia = require('../Models/Agencia');    
    module.exports = agenciaController;
    
    function agenciaController() {    
        this.getAgencias = function() {
    
            return Agencia.query()
                .then(function(agencias) {
                    return agencias;            
                })
                .catch(function(){
                    console.log("error en la promesa");
                });
        }
    }
    

    还有我的 index.js:

    var reqAgenciaController = require('./Controllers/agenciaController');
    var agenciaController = new reqAgenciaController();
    
    app.get("/agencias", function(req, res) {
        var misAgencias;
        var promise = new Promise(function(resolve, reject) {
            if (agenciaController.getAgencias() === undefined){
                reject("Error al llamar al getAgencias");
            }else {
                resolve(agenciaController.getAgencias());
            }
        });
    
        promise
        .then( agencias => {
            misAgencias = agencias;
            console.log(misAgencias);
            res.send(misAgencias);      
        })
        .catch(err => console.log("Error: "+err))
    });
    

    【讨论】:

      【解决方案3】:
      fn: async function() {
          var output = '';
          await myPromise()
          .then((data) => {
              output = data;
          })
          .catch((err) => {
              output = "Error: " + err;
          });
      
          return ans;
      }
      

      请注意我们如何在fn 返回其值之前通过await 完成承诺

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-12-02
        • 2018-04-08
        • 2019-04-21
        • 2014-01-15
        • 2014-10-22
        • 2016-02-22
        • 2021-02-13
        • 2019-01-23
        相关资源
        最近更新 更多