Meteor.wrapAsync 和 NPM 包 (Steam)
Meteor.wrapAsync and NPM package (Steam)
我正在尝试为我的 Meteor 应用程序构建一个简单的 STEAM 机器人,但我遇到了障碍,因为我不知道如何正确使用 Meteor.wrapAsync 以便在前面正确显示结果.
我的代码如下所示:
1.服务器
import SteamUser from 'steam-user';
import SteamTotp from 'steam-totp';
import SteamCommunity from 'steamcommunity';
import TradeOfferManager from 'steam-tradeoffer-manager';
tradeBot1 = Meteor.settings.SteamTradeBot1;
// Vars
const client = new SteamUser();
const community = new SteamCommunity();
const manager = new TradeOfferManager({
steam: client,
community: community,
language: 'en'
});
const logOnOptionsBot1 = {
accountName: tradeBot1.username,
password: tradeBot1.password,
twoFactorCode: SteamTotp.generateAuthCode(tradeBot1.sharedSecret)
};
// Bot login
client.logOn(logOnOptionsBot1);
// After login set bot as online
client.on('loggedOn', Meteor.bindEnvironment(function(){
console.log('Steam Trade Bot #1 online.');
client.setPersona(SteamUser.Steam.EPersonaState.Online);
}));
// Set cookies
client.on('webSession', Meteor.bindEnvironment(function(sessionid, cookies){
manager.setCookies(cookies);
community.setCookies(cookies);
}));
Meteor.methods({
"sendTradeOffer": function(tradeUrl, winId, uid){
try {
var assetId = "1111111111";
var appid = "730";
var itemName = "itemnamexxxxxxx";
// Create new offer
// https://github.com/DoctorMcKay/node-steam-tradeoffer-manager/wiki/TradeOfferManager
const offer = manager.createOffer(tradeUrl);
// Add item to offer
offer.addMyItem({
'assetid': assetId,
'appid': appid,
'contextid': 2,
'amount': 1
});
// Set custom message
offer.setMessage(`Congrats! You got "${itemName}"! Ref: "` + winId + `"`);
// Send offer
offer.send(Meteor.bindEnvironment(function(err, status){
if (err) {
console.log(err);
return err;
} else {
console.log(`Sent offer. Status: ${status}. Waiting for auto confirmation ...`);
// Set a 5 second delay before confirmation
Meteor.setTimeout(function(){
community.acceptConfirmationForObject(tradeBot1.indentitySecret, offer.id, Meteor.bindEnvironment(function(err){
if (err) {
console.log(err);
return err;
} else {
console.log("Offer confirmed.");
console.log("Sent Steam item with ID: " + assetId);
// Update data in mongo
// .....
// Return something to the front ???
var outcome = {
message: "Trade offer sent!"
}
return outcome;
}
}));
}, 5000);
}
}));
} catch(error){
console.log(error);
return error;
}
}
});
2。前面
'submit form#send-trade': function(event, t){
event.preventDefault();
var tradeUrl = $("#user-trade-url").val();
var winId = "winidxxxxxxx";
var uid = "uidxxxxxxx";
Meteor.call("sendTradeOffer", tradeUrl, winId, uid, function(error, result){
if (error){
console.log(error);
} else {
console.log(result);
}
});
}
这应该做的是:
- 机器人登录 - 工作
- 登录后将机器人状态设置为在线 - 工作中
- 用户在前面输入他们的 tradeUrl - 有效
- Meteor 方法 sendTradeOffer 已执行 - 工作
- 报价已发送并确认 - 有效
- Return 前面的错误或结果 - 不工作
Console.logs 在服务器上工作得很好,但我不能 return 前面的任何东西,它总是未定义。
过去几天我搜索了很多,据我所知,我应该使用 Meteor.wrapAsync 来正确 return 错误或结果,但我就是做不到把我的头围起来。 Meteor.wrapAsync 如何适用于我的情况?
非常感谢任何帮助。
非常感谢!
此答案的来源来自 @robfallows 官方 Meteor 论坛:
Meteor.methods({
sendTradeOffer(tradeUrl, winId, uid) {
// Create new offer
const offer = manager.createOffer(tradeUrl);
// Meter.wrapAsync
const offerSend = Meteor.wrapAsync(offer.send, offer);
const communityAcceptConfirmationForObject = Meteor.wrapAsync(community.acceptConfirmationForObject, community);
try {
const assetId = '1111111111';
const appid = '730';
const itemName = 'itemnamexxxxxxx';
// Add item to offer
offer.addMyItem({
'assetid': assetId,
'appid': appid,
'contextid': 2,
'amount': 1
});
// Set custom message
offer.setMessage(`Congrats! You got ${itemName}! Ref: ${winId}`);
// Send offer
const status = offerSend(); // will throw error on failure
console.log(`Sent offer. Status: ${status}. Waiting for auto confirmation ...`);
// Set a 5 second delay before confirmation
Meteor._sleepForMs(5000); // Fiber based inline sleep
communityAcceptConfirmationForObject(tradeBot1.indentitySecret, offer.id); // will throw error on failure
console.log('Offer confirmed.');
console.log('Sent Steam item with ID: ', assetId);
// Update data in mongo
// .....
// Return something to the front ???
const outcome = {
message: 'Trade offer sent!'
}
return outcome;
} catch (err) {
throw new Meteor.Error('oops', err.message); // return error to client
}
},
});
根据他的笔记:
- 删除所有回调以使用纤程。这意味着代码有效
顺序并且 return 对象在它所在的位置可用
似乎。
- Meteor.wrapAsync 用于两个似乎
需要它
- 为 ES6 做准备(ESLint 是个严厉的女主人!)
我正在尝试为我的 Meteor 应用程序构建一个简单的 STEAM 机器人,但我遇到了障碍,因为我不知道如何正确使用 Meteor.wrapAsync 以便在前面正确显示结果.
我的代码如下所示:
1.服务器
import SteamUser from 'steam-user';
import SteamTotp from 'steam-totp';
import SteamCommunity from 'steamcommunity';
import TradeOfferManager from 'steam-tradeoffer-manager';
tradeBot1 = Meteor.settings.SteamTradeBot1;
// Vars
const client = new SteamUser();
const community = new SteamCommunity();
const manager = new TradeOfferManager({
steam: client,
community: community,
language: 'en'
});
const logOnOptionsBot1 = {
accountName: tradeBot1.username,
password: tradeBot1.password,
twoFactorCode: SteamTotp.generateAuthCode(tradeBot1.sharedSecret)
};
// Bot login
client.logOn(logOnOptionsBot1);
// After login set bot as online
client.on('loggedOn', Meteor.bindEnvironment(function(){
console.log('Steam Trade Bot #1 online.');
client.setPersona(SteamUser.Steam.EPersonaState.Online);
}));
// Set cookies
client.on('webSession', Meteor.bindEnvironment(function(sessionid, cookies){
manager.setCookies(cookies);
community.setCookies(cookies);
}));
Meteor.methods({
"sendTradeOffer": function(tradeUrl, winId, uid){
try {
var assetId = "1111111111";
var appid = "730";
var itemName = "itemnamexxxxxxx";
// Create new offer
// https://github.com/DoctorMcKay/node-steam-tradeoffer-manager/wiki/TradeOfferManager
const offer = manager.createOffer(tradeUrl);
// Add item to offer
offer.addMyItem({
'assetid': assetId,
'appid': appid,
'contextid': 2,
'amount': 1
});
// Set custom message
offer.setMessage(`Congrats! You got "${itemName}"! Ref: "` + winId + `"`);
// Send offer
offer.send(Meteor.bindEnvironment(function(err, status){
if (err) {
console.log(err);
return err;
} else {
console.log(`Sent offer. Status: ${status}. Waiting for auto confirmation ...`);
// Set a 5 second delay before confirmation
Meteor.setTimeout(function(){
community.acceptConfirmationForObject(tradeBot1.indentitySecret, offer.id, Meteor.bindEnvironment(function(err){
if (err) {
console.log(err);
return err;
} else {
console.log("Offer confirmed.");
console.log("Sent Steam item with ID: " + assetId);
// Update data in mongo
// .....
// Return something to the front ???
var outcome = {
message: "Trade offer sent!"
}
return outcome;
}
}));
}, 5000);
}
}));
} catch(error){
console.log(error);
return error;
}
}
});
2。前面
'submit form#send-trade': function(event, t){
event.preventDefault();
var tradeUrl = $("#user-trade-url").val();
var winId = "winidxxxxxxx";
var uid = "uidxxxxxxx";
Meteor.call("sendTradeOffer", tradeUrl, winId, uid, function(error, result){
if (error){
console.log(error);
} else {
console.log(result);
}
});
}
这应该做的是:
- 机器人登录 - 工作
- 登录后将机器人状态设置为在线 - 工作中
- 用户在前面输入他们的 tradeUrl - 有效
- Meteor 方法 sendTradeOffer 已执行 - 工作
- 报价已发送并确认 - 有效
- Return 前面的错误或结果 - 不工作
Console.logs 在服务器上工作得很好,但我不能 return 前面的任何东西,它总是未定义。
过去几天我搜索了很多,据我所知,我应该使用 Meteor.wrapAsync 来正确 return 错误或结果,但我就是做不到把我的头围起来。 Meteor.wrapAsync 如何适用于我的情况?
非常感谢任何帮助。
非常感谢!
此答案的来源来自 @robfallows 官方 Meteor 论坛:
Meteor.methods({
sendTradeOffer(tradeUrl, winId, uid) {
// Create new offer
const offer = manager.createOffer(tradeUrl);
// Meter.wrapAsync
const offerSend = Meteor.wrapAsync(offer.send, offer);
const communityAcceptConfirmationForObject = Meteor.wrapAsync(community.acceptConfirmationForObject, community);
try {
const assetId = '1111111111';
const appid = '730';
const itemName = 'itemnamexxxxxxx';
// Add item to offer
offer.addMyItem({
'assetid': assetId,
'appid': appid,
'contextid': 2,
'amount': 1
});
// Set custom message
offer.setMessage(`Congrats! You got ${itemName}! Ref: ${winId}`);
// Send offer
const status = offerSend(); // will throw error on failure
console.log(`Sent offer. Status: ${status}. Waiting for auto confirmation ...`);
// Set a 5 second delay before confirmation
Meteor._sleepForMs(5000); // Fiber based inline sleep
communityAcceptConfirmationForObject(tradeBot1.indentitySecret, offer.id); // will throw error on failure
console.log('Offer confirmed.');
console.log('Sent Steam item with ID: ', assetId);
// Update data in mongo
// .....
// Return something to the front ???
const outcome = {
message: 'Trade offer sent!'
}
return outcome;
} catch (err) {
throw new Meteor.Error('oops', err.message); // return error to client
}
},
});
根据他的笔记:
- 删除所有回调以使用纤程。这意味着代码有效 顺序并且 return 对象在它所在的位置可用 似乎。
- Meteor.wrapAsync 用于两个似乎 需要它
- 为 ES6 做准备(ESLint 是个严厉的女主人!)