节点-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;
我希望导入此“请求承诺”的结果(来自console.log的数据&#39;)到另一个文件(如app.js)通过:
app.js
const module = require("./module");
我的模块工作正常,(console.log打印出我想要的确切数据)但我无法通过导入或要求从另一个* .js访问数据: 在这种情况下:
let data = module('name');
console.log(data);
我收到数据 - 欠定义(因为请求是承诺,而且尚未完成,我是对的吗?)
但是当我尝试:
module('name').then((data=> {console.log(data)});
我有错误: TypeError:无法读取属性&#39;然后&#39;未定义的
那么我做错了什么以及如何重写呢? 实际上它是如何工作的,我指向/定义函数(&#39; name&#39;),并且模块通过异步请求提供一个nessesary数据。然后将其返回&#39;返回&#39;到 app.js P.S.Actually我重命名代码中的每个变量以便更好地解释。在我自己的情况下,它不是一个单一的请求&#39;我的模块有另一个名字。
UPDATING
是的,我已经尝试了
function module(name) {
return request(['arr_result1', 'arr_result2', 'arr_result3'], {params, name})
和&#39;数据&#39;打印很好,但为什么这段代码不能正常工作?
module('name').then(data => {
console.log(data); //prints succesfully
mongoose_schema-DB.create({data});
});
(node:17964)UnhandledPromiseRejectionWarning:未处理的promise拒绝(拒绝id:1):ValidationError:**这里是验证错误,就像根本没有数据一样,但是console.log将数据集打印为&#39; ok&# 39; [DEP0018]弃用警告:不推荐使用未处理的拒绝承诺。将来,未处理的承诺拒绝将使用非零退出代码终止Node.js进程。
这是mongoose_schema-DB代码:
让mongoose = require(&#39; mongoose&#39;);
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_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 verison ......
我只是用回调重写快速版本,而不是.catch。不知道如何,但它工作正常。谢谢所有@Bergi和@Keith提供的nessasry支持!
答案 0 :(得分:2)
是的,这是一个承诺,你需要像你尝试的那样使用.then
等待它,但你还需要return
来自module
函数的承诺!
function module(name) {
return request(['arr_result1', 'arr_result2', 'arr_result3'], {params, name})
// ^^^^^^
.then(…)
.then(…)
.catch(…);
}
您可能还想省略catch
并让模块的调用者处理错误,而不是接收undefined
处理程序结果。