当前位置: 首页 > 知识库问答 >
问题:

模块导出已实现的promise结果

艾茂学
2023-03-14

节点-V 8.9.3

我得到了自己的模块,它是另一个模块的一部分,像这样:

module.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打印我想要的准确数据),但我无法通过import或require从另一个*.js访问数据:在本例中:

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

我收到的数据被低估了(因为请求是承诺的,它还没有完全填满,对吗?)

但当我试着:

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

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

那么我做错了什么,应该如何重写呢?实际上它是如何工作的,I点/定义函数('name'),模块通过异步请求提供必要的数据。然后返回“back”到app.js p.s。实际上,为了更好地解释,我重命名了代码中的每个变量。在我自己的例子中,它不是一个单一的“请求”,我的模块完全有另一个名称。

更新

是的,我已经试过

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

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

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

(节点:17964)UnhandledPromiseRejectionWarning:未处理的承诺拒绝(拒绝ID:1):ValidationError:**这里是验证错误,就像根本没有数据一样,但Console.log将其数据集打印为“OK”[DEP0018]DeprecationWarning:未处理的承诺拒绝被弃用。将来,未处理的承诺拒绝将以非零退出代码终止node.js进程。

下面是mongoose_schema-DB代码:

让mongoose=require(“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;

或此部分以明示

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_schema-db.create({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版本,而不是.catch。不知道怎么做,但很好用。感谢所有@bergi和@keith为nessasry提供的支持!

共有1个答案

荆城
2023-03-14

是的,这是一个承诺,您需要使用等待它。然后像您尝试的那样,但您还需要从模块函数中返回该承诺!

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

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

 类似资料:
  • 本文向大家介绍javascript中导出与导入实现模块化管理教程,包括了javascript中导出与导入实现模块化管理教程的使用技巧和注意事项,需要的朋友参考一下 在理想情况下,开发者只需要实现核心的业务逻辑,其他都可以加载别人已经写好的模块。但是,在ES6以前,JavaScript一直没有自己模块体系(module),无法将一个大程序拆分成互相依赖的小文件,再用简单的方法拼装起来。如果要想在前端

  • 问题内容: 我的目标是使用Webpack将隔离的组件导出到假定的全局对象中。 index.html 在上面的示例中,我假设有一个全局对象/模块,该对象/模块的属性将附加其他模块。因此,我想将隔离的模块附加到全局对象,而又不破坏or 。 webpack.config.js src / main.jsx 我尝试将Webpack的值设置为每个可能的值(请参阅http://webpack.github.i

  • 本文向大家介绍详解JS模块导入导出,包括了详解JS模块导入导出的使用技巧和注意事项,需要的朋友参考一下 开发中基本不会将所有的业务逻辑代码放在一个JS文件中,特别是在使用前端框架,进行组件化开发中时,会复用相应的组件。这时,就会用到模块导入/导出的方法了。 当然,上面提到有模块的概念,也是在JS用于服务器端编程的时候才会出现,我们在使用前端框架时,使用npm run dev,不就是启动了一个nod

  • 问题内容: 我想知道配置模块导出的最佳方法是什么。在下面的示例中,“ async.function”可以是FS或HTTP请求,为示例起见简化了该请求: 这是示例代码(asynmodule.js): 如何仅在执行异步回调后导出模块? 编辑 有关我的实际用例的简短说明:我正在编写一个模块,用于在fs.exists()回调中配置nconf(https://github.com/flatiron/ncon

  • 问题内容: 如何枚举所有导入的模块? 例如,我想从以下代码中获取: 问题答案: 仅获取当前模块的所有导入的一种近似方法是检查模块: 这不会返回本地导入或非模块导入(如)。请注意,这将返回,因此,如果您使用的话,将获得原始模块名称。如果要使用别名,则使用yield名称代替。

  • 我试图上传一个图像到内存使用multer,然后处理它与夏普和保存到磁盘。当我尝试在我的中间件中做多个module.exports时。 错误是: TypeError FileUpload.Single不是函数 到目前为止的路线是: 当我刚刚有下面的路由之前,尝试添加图像处理,我没有得到一个错误;