代码之家  ›  专栏  ›  技术社区  ›  Paul Meyer

Axios不发送HTTP post请求

  •  0
  • Paul Meyer  · 技术社区  · 6 年前

    在使用axios的nodejs中,在alexa技能范围内执行http post请求时遇到问题

    在此项目之前,我使用过axios,在发送CRUD请求时从未遇到任何问题。

    我的请求处理程序如下所示:

    const handlers = {
    
        'LaunchRequest': function () {
          this.emit(':ask', 'What is your emergency?', 'How can I help you' )
        },
        'InjuryHelpIntent': function () {
          const accessToken = this.event.context.System.user.accessToken
          const userId= this.event.context.System.user.userId
          console.log('user id: ', userId)
          getDeviceAddress(this.event)
          .then((address) => {
              const res = sendHelp(address,accessToken)
              console.log(res)
              this.emit(':tell', 'Succes!')
            })
          .catch((error) => {
            console.log('Error message: ',error)
            this.emit(':tell', error)
          })
    
    
        },
    
    }
    

    sendHelp(address, token) 函数I调用REST服务。

    发送帮助。js公司:

    const axios = require('axios')
    module.exports = (address, token) => {
        axios.post('https://api-sandbox.safetrek.io/v1/alarms')
        .then(response => {
          console.log(response)
          return response})
        .catch(error => {
          console.log(error)
          return error})
    
    }
    

    与此同时,我试图发布数据,但没有任何效果,即使是未经授权的呼叫,也不像我在《绝望的尝试》中看到的那样 sendHelp.js 在这里 我预计不会因为缺少授权而出现401错误。 const res 在我的处理程序中应该是一个json对象,但是 undefined 。它完全跳过POST请求。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Mark    6 年前

    不能从异步函数返回值,如 axios.post() 并希望简单地同步接收返回值。换句话说,这是行不通的:

    const res = sendHelp(address,accessToken)
    

    有两个原因。第一 sendHelp() 实际上没有归还任何东西。即使它这样做了,也需要返回一个承诺,而不是异步axios函数的结果。您需要回复axios的承诺,然后致电 then() 在上面。例如:

    const axios = require('axios')
    module.exports = (address, token) => {
        // axios.post() returns a promise. Return that promise to the caller
        return axios.post('https://api-sandbox.safetrek.io/v1/alarms')
        .then(response => {
            console.log(response)
            return response
        })
        .catch(error => {
            console.log(error)
            return error
        })
    }
    

    现在,您可以将该承诺用于以下内容:

    getDeviceAddress(this.event)
     .then((address) => sendHelp(address,accessToken))
     .then(res => {
        console.log(res)
        this.emit(':tell', 'Succes!')
      })
     .catch(err => handleError())