无法访问用户信息对象 属性 - Facebook 聊天 api

Unable to access user info object property - facebook chat api

我正在使用 Facebook chat api 创建一个简单的 cli 脚本来回复发送到我的 facebook 帐户的消息。我正在尝试分配并获取用户名和我的名字以在回复中使用它们,但它们始终未定义。我认为对象 属性 没有正确分配。有解决办法吗?

require('dotenv').config();
const fs = require('fs');
const fb = require('facebook-chat-api'); 
const path = require('path');
const appStateFile = path.format({ dir: __dirname, base: 'appstate.json' });
let currentUser = null;

if( !fs.existsSync(appStateFile) ){
    //debug .env
    console.log(process.env);

    fb({email: process.env.FB_EMAIL, password: process.env.FB_PWD}, (err, api) => {
        if(err){ 
            return console.log(err);
        }
        console.log(api);
        api.setOptions({
            listenEvents: true
        });
        fs.writeFileSync(appStateFile, JSON.stringify(api.getAppState()));
        let id = api.getCurrentUserID();
        api.getUserInfo(id, (err, profile) => {
            console.log(profile); // profile is logged correctly
            currentUser = profile;
        });
        api.listenMqtt( (err, event) => {
            if(err){ 
                return console.log(err);
            }
            if(event.type === 'message'){
                console.log(event.body)
                api.getUserInfo(event.senderID, (err, user) => {
                    if(err){
                        return console.log(err);
                    }
                    console.log(user); // user object is logged correctly
                    api.sendMessage('...', event.threadID)
                });
            }
        });
    });
}else{
    fb({appState: JSON.parse(fs.readFileSync(appStateFile))}, (err, api) => {
        if(err){ 
            return console.log(err);
        }
        console.log(api);
        api.setOptions({
            listenEvents: true
        });

        let id = api.getCurrentUserID();
        api.getUserInfo(id, (err, profile) => {
            console.log(profile);
            currentUser = profile;
        });
        api.listenMqtt( (err, event) => {
            if(err){ 
                return console.log(err);
            }
            if(event.type === 'message'){
                console.log(event.body)
                api.getUserInfo(event.senderID, (err, user) => {
                    if(err){
                        return console.log(err);
                    }
                    console.log(user)
                    api.sendMessage(`FB Pager v1.0.\nHi ${user.name}!Your message was forwarded with an email to ${currentUser.name}.`, event.threadID)
                });
            }
        });
    });
}

我认为这里的问题是 api.getUserInfo 是异步的。 所以你需要嵌套它们才能让它工作。

或者您可以试试这个,因为 getUSerInfo 允许您添加一组用户 ID 来获取数据:

api.listenMqtt((err, event) => {
  if (err) {
    return console.log(err);
  }

  if (event.type === "message") {
    const currentUserId = api.getCurrentUserID();
    const senderId = event.senderID;

    api.getUserInfo([currentUserId, senderId], (err, ret) => {
      if(err) return console.error(err);

      // Ret should contain the two users
      // See: https://github.com/Schmavery/facebook-chat-api/blob/master/DOCS.md#getUserInfo
      console.log(ret);
    });
  }
});

嵌套用户调用方法:

api.listenMqtt((err, event) => {
  if (err) {
    return console.log(err);
  }

  if (event.type === "message") {
    let currentUserId = api.getCurrentUserID();
    api.getUserInfo(currentUserId, (err1, signedInUser) => {
      if (err1) {
        return console.log(err);
      }
      api.getUserInfo(event.senderID, (err2, userInMessage) => {
        if (err2) {
          return console.log(err);
        }

        console.log(signedInUser, userInMessage)

        api.sendMessage("...", event.threadID);
      });
    });
  }
});

经过大量调试,我找到了访问所需信息的正确方法。由于检索后的用户信息被映射到另一个对象,即 userId,因此访问每个 属性 的唯一方法是使用 for 循环。最初我认为这可以避免,但不幸的是这是必要的,否则仅使用点符号将导致 undefined。我就是这样解决的

api.getUserInfo(userId, (err, user) => {
  let username;
  if(err){
   return console.log(err);
  }
  for(var prop in user){
   username = user[prop].name;
  }
  api.sendMessage(`Hello ${username!}`, event.threadID);   
});