Meteor Mongo 在 Fiber 中更新回调
Meteor Mongo update callback in Fiber
当客户端调用更新 mongo 集合但产生以下错误的服务器端方法时,将触发此流星代码:
Error: Meteor code must always run within a Fiber. Try wrapping callbacks that you pass to non-Meteor libraries with Meteor.bindEnvironment.
知道如何消除此错误以便进行更新吗?
谢谢
//server/methods.js
'importFromAccess': function(){
let fileName = 'C:\Users\ABC\Downloads\tblCstmrs.txt';
const readInterface = readline.createInterface({
input: fs.createReadStream(fileName),
output: process.stdout,
console: false
});
readInterface.on('line', function(line) {
let custObj = customerMsAccessDataObj(line);
console.log("will update");
ContactsCol.update(custObj, { upsert: true }, Meteor.bindEnvironment( function (err, result) {
if (err) throw err;
console.log(result);
})
);
console.log("finished update")
});
}
//client file
'msAccess_autoShop': (event, fullName) => {
Meteor.call('importFromAccess');
}
readInterface.on('line', function (line) { ... })
回调在纤程外部调用。有一个 Meteor.bindEnvironment
将回调包装在纤程中:
readInterface.on('line', Meteor.bindEnvironment(function (line) { ... }));
这将确保回调将有一个纤程可供使用(它将创建一个新纤程或使用它在其中调用的纤程)。
还有 Meteor.wrapAsync
,它将回调式函数转换为同步函数(它实际上是异步的,但纤程会处理它)。
当客户端调用更新 mongo 集合但产生以下错误的服务器端方法时,将触发此流星代码:
Error: Meteor code must always run within a Fiber. Try wrapping callbacks that you pass to non-Meteor libraries with Meteor.bindEnvironment.
知道如何消除此错误以便进行更新吗? 谢谢
//server/methods.js
'importFromAccess': function(){
let fileName = 'C:\Users\ABC\Downloads\tblCstmrs.txt';
const readInterface = readline.createInterface({
input: fs.createReadStream(fileName),
output: process.stdout,
console: false
});
readInterface.on('line', function(line) {
let custObj = customerMsAccessDataObj(line);
console.log("will update");
ContactsCol.update(custObj, { upsert: true }, Meteor.bindEnvironment( function (err, result) {
if (err) throw err;
console.log(result);
})
);
console.log("finished update")
});
}
//client file
'msAccess_autoShop': (event, fullName) => {
Meteor.call('importFromAccess');
}
readInterface.on('line', function (line) { ... })
回调在纤程外部调用。有一个 Meteor.bindEnvironment
将回调包装在纤程中:
readInterface.on('line', Meteor.bindEnvironment(function (line) { ... }));
这将确保回调将有一个纤程可供使用(它将创建一个新纤程或使用它在其中调用的纤程)。
还有 Meteor.wrapAsync
,它将回调式函数转换为同步函数(它实际上是异步的,但纤程会处理它)。