首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取API函数调用外部变量的值

获取API函数调用外部变量的值
EN

Stack Overflow用户
提问于 2022-04-24 16:42:52
回答 1查看 50关注 0票数 1

我试图做一个聊天应用程序项目与虐待文本检测。我找到了在线聊天应用程序的代码,并希望使用透视API添加文本检测。API具有毒性、威胁等几个属性。我能够在API函数中设置属性,但无法在API函数之外访问它们。

以下是有关守则:-

代码语言:javascript
复制
  const sendMessage = asyncHandler(async (req, res) => {
  const { content, chatId } = req.body;

  let toxicity, insult, profanity, threat;

  if (!content || !chatId) {
    console.log("Invalid data passed into request");
    return res.sendStatus(400);
  }

  let newMessage = {
    sender: req.user._id,
    content: content,
    chat: chatId,
    toxicity: toxicity,
    insult: insult,
    profanity: profanity,
    threat: threat,
  };

  let inputText = newMessage.content;

  // Perspective API
  google
    .discoverAPI(process.env.DISCOVERY_URL)
    .then((client) => {
      const analyzeRequest = {
        comment: {
          text: inputText,
        },
        requestedAttributes: {
          TOXICITY: {},
          INSULT: {},
          PROFANITY: {},
          THREAT: {},
        },
      };

      client.comments.analyze(
        {
          key: process.env.API_KEY,
          resource: analyzeRequest,
        },
        (err, response) => {
          if (err) throw err;
          // console.log(JSON.stringify(response.data, null, 2));
          toxicity = (response.data.attributeScores.TOXICITY.summaryScore.value * 100).toFixed(2);
          insult = (response.data.attributeScores.INSULT.summaryScore.value * 100).toFixed(2);
          profanity = (response.data.attributeScores.PROFANITY.summaryScore.value * 100).toFixed(2);
          threat = (response.data.attributeScores.THREAT.summaryScore.value * 100).toFixed(2);

          newMessage.toxicity = toxicity;
          newMessage.insult = insult;
          newMessage.profanity = profanity;
          newMessage.threat = threat;
          console.log("1-" + newMessage.toxicity); // This returns the desired output
        }
      );
    })
    .catch((err) => {
      throw err;
    });
  //

  console.log("2-" + newMessage.toxicity); // This returns undefined

  try {
    let message = await Message.create(newMessage);

    message = await message.populate("sender", "name profilePic");
    message = await message.populate("chat");
    message = await User.populate(message, {
      path: "chat.users",
      select: "name profilePic email",
    });

    await Chat.findByIdAndUpdate(req.body.chatId, {
      latestMessage: message,
    });

    res.json(message);
  } catch (error) {
    res.status(400);
    throw new Error(error.message);
  }
});

我希望在API调用之后更新newMessage。在遇到这个帖子之后,我发现console.log("2-" + newMessage.toxicity)console.log("1-" + newMessage.toxicity)之前执行。我尝试使用回调和异步/等待,但无法使它工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-24 17:16:59

console.log("2-" + newMessage.toxicity)位于google.discoverAPI调用之外,因此它立即执行。

你可以试试这样的东西

代码语言:javascript
复制
const sendMessage = asyncHandler(async (req, res) => {
  const { content, chatId } = req.body;

  let toxicity, insult, profanity, threat;

  if (!content || !chatId) {
    console.log("Invalid data passed into request");
    return res.sendStatus(400);
  }

  let newMessage = {
    sender: req.user._id,
    content: content,
    chat: chatId,
    toxicity: toxicity,
    insult: insult,
    profanity: profanity,
    threat: threat,
  };

  let inputText = newMessage.content;

  // Perspective API
  const client = await google
    .discoverAPI(process.env.DISCOVERY_URL)
    
  const analyzeRequest = {
     comment: {
       text: inputText,
    },
    requestedAttributes: {
       TOXICITY: {},
       INSULT: {},
       PROFANITY: {},
       THREAT: {},
      },
    };
    await new Promise((resolve, reject) => {
   
      client.comments.analyze(
        {
          key: process.env.API_KEY,
          resource: analyzeRequest,
        },
        (err, response) => {
          if (err) {
           reject(err)
          }
          
          // console.log(JSON.stringify(response.data, null, 2));
          toxicity = (response.data.attributeScores.TOXICITY.summaryScore.value * 100).toFixed(2);
          insult = (response.data.attributeScores.INSULT.summaryScore.value * 100).toFixed(2);
          profanity = (response.data.attributeScores.PROFANITY.summaryScore.value * 100).toFixed(2);
          threat = (response.data.attributeScores.THREAT.summaryScore.value * 100).toFixed(2);

          newMessage.toxicity = toxicity;
          newMessage.insult = insult;
          newMessage.profanity = profanity;
          newMessage.threat = threat;
          console.log("1-" + newMessage.toxicity);
          resolve()
        }
      );
    })
    .catch((err) => {
      throw err;
    });
  //

  console.log("2-" + newMessage.toxicity); // This returns undefined

  try {
    let message = await Message.create(newMessage);

    message = await message.populate("sender", "name profilePic");
    message = await message.populate("chat");
    message = await User.populate(message, {
      path: "chat.users",
      select: "name profilePic email",
    });

    await Chat.findByIdAndUpdate(req.body.chatId, {
      latestMessage: message,
    });

    res.json(message);
  } catch (error) {
    res.status(400);
    throw new Error(error.message);
  }
});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71990422

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档