代码之家  ›  专栏  ›  技术社区  ›  AlexZeDim

模块导出已实现的承诺结果

  •  0
  • AlexZeDim  · 技术社区  · 7 年前

    节点-v 8.9.3

    我有自己的模块,它是另一个模块的一部分,如下所示:

    单元js公司

    function module(name) {
        request(['arr_result1', 'arr_result2', 'arr_result3'], {params, name}) //it's not actual request, I just rename it, 'name' is the same as function
            .then(response => {
                let data = [];
                data.name = response.data.arr_result1;
                data.guild = response.data.arr_result2;
                data.check_sum = 0;
                for (let i = 0; i < 3; i++) {
                    data.check_sum += adler32.sum(new Buffer((response.data.arr_result3)));
                }
                return (data);
            })
            .then(data => {
                if (data.arr_result2 === undefined) {
                    data.arr_result2 = 'TEST';
                } else {
                    data.arr_result2 = data.arr_result2;
                }
                //other logic 
                console.log(data);
                return data;
            })
            .catch(function (error) {
                console.log(error )
            });
        }
    
    module.exports = module;
    

    我想通过以下方式将此“请求承诺”的结果(“data”from console.log)导入另一个文件(如app.js):

    应用程序。js公司

    const module = require("./module");
    

    我的模块工作正常,(console.log打印我想要的确切数据),但我无法从另一个*访问数据。js通过导入或要求: 在这种情况下:

    let data = module('name');
    console.log(data);
    

    我收到的数据不够精确(因为请求是承诺,但还没有完成,对吗?)

    但当我尝试:

    module('name').then((data=> {console.log(data)});
    

    我有错误: TypeError:无法读取未定义的属性“then”

    那么,我做错了什么?我应该如何重写它? 实际上,它是如何工作的,我指向/定义函数(“name”),模块通过异步请求提供必要的数据。然后将其返回到“返回” 应用程序。js公司 P、 实际上,为了更好的解释,我重命名了代码中的每个变量。在我自己的情况下,这不是一个单独的“请求”,我的模块绝对有另一个名称。

    正在更新

    是的,我已经试过了

    function module(name) {
        return request(['arr_result1', 'arr_result2', 'arr_result3'], {params, name})
    

    “数据”打印得很好,但为什么这段代码不能正常工作呢?

    module('name').then(data => {
        console.log(data); //prints succesfully
        mongoose_schema-DB.create({data});
    });
    

    (节点:17964)UnhandledPromisejectionWarning:Unhandled Promisejection拒绝(拒绝id:1):ValidationError:*这是一个验证错误,好像根本没有数据,只有控制台。日志将it数据集打印为“ok”[DEP0018]弃用警告:未处理的承诺拒绝被弃用。将来,未处理的承诺拒绝将终止节点。具有非零退出代码的js进程。

    以下是mongoose\u schema-DB代码:

    让mongoose=要求(“mongoose”);

    mongoose.connect('mongodb://localhost/dma', { useMongoClient: true });
    mongoose.Promise = global.Promise;
    //schema itself
    let mongoose_schema-DB= mongoose.model('mongoose_schema-DB', schema);
    module.exports = mongoose_schema-DB;
    

    或Express中的此部分

    app.all('/item', function (req, res, next) {
       module('name').then(data => {
            mongooseDB_schema-DB.create({data});
        });
      },function (err, res) {
        if (err) return handleError(err);
        console.log(res);
      });
      next();
    });
    

    已更新

    最有趣的是,这段代码运行良好,而不是简单的mongooseDB\u schema-DB。创建({data})

    module(name).then(data => {
        mongooseDB_schema-DB.create({
            field1: data.1,
            field2: data.2,
            field3: data.3,
            field4: data.4,
            field5: data.5,
            field6: data.6,
        });
    });
    

    我正在检查它的快速验证。。。

    我只是用回调重写了express版本,而不是。接住我不知道怎么做,但效果很好。感谢所有@Bergi和@Keith提供nessasry支持!

    1 回复  |  直到 7 年前
        1
  •  2
  •   Bergi    7 年前

    是的,这是一个承诺,你需要等待它使用 .then 就像你尝试过的,但你也需要 return 你的承诺 module 作用

    function module(name) {
        return request(['arr_result1', 'arr_result2', 'arr_result3'], {params, name})
    //  ^^^^^^
        .then(…)
        .then(…)
        .catch(…);
    }
    

    您可能还想省略 catch 并让模块的调用者处理错误,而不是接收 undefined 处理程序结果。