代码之家  ›  专栏  ›  技术社区  ›  Ari

我如何在路由中发出请求,并仅在我有响应数据时响应?

  •  -1
  • Ari  · 技术社区  · 4 年前

    我被告知要使用axios,但它是异步的,将在内部POST请求完成之前做出响应:

    var express = require('express');
    const axios = require('axios').default;
    var router = express.Router();
    
    
    router.get('/', function (req, res, next) {
        axios({
            url: "https://example.com/api",
            method: "POST",
            data: "Some data"
        }).then(response => {
            console.log(response) // I want to return this
        }).catch(error => {
            console.log(error) // or this
        })
        res.send("Response or error data here")
    });
    
    module.exports = router;
    
    

    我应该使用同步模块吗?

    2 回复  |  直到 4 年前
        1
  •  1
  •   antonku    4 年前

    只需将响应或错误传递给 res.json 解决/拒绝axios承诺时:

    router.get('/', function (req, res, next) {
      axios({
        url: "https://example.com/api",
        method: "POST",
        data: "Some data"
      }).then(response => {
        res.json(response)
      }).catch(error => {
        res.json(error)
      })
    });
    
        2
  •  1
  •   Anuj Pancholi    4 年前

    var express = require('express');
    const axios = require('axios').default;
    var router = express.Router();
    
    
    router.get('/', function (req, res, next) {
        axios({
            url: "https://example.com/api",
            method: "POST",
            data: "Some data"
        }).then(response => {
            console.log() // I want to return this
            res.send(response)
        }).catch(error => {
            console.log(error) // or this
            res.status(500).send({
                message: e.message || "INTERNAL SERVER ERROR"
            });
        })
        
    });
    
    module.exports = router;
    

    这个 res 对象的作用域在您在 .then() ,这样你就可以打电话给 res.send 从那里开始。另外,一定要在邮件中用一些东西来回应 .catch() 因此,如果发生错误,API会做出响应,而不是卡住并超时。

    笔记 当前位置我用一个 message 而不是用 error 对象本身,就是我不知道我会得到什么 错误 .例如,如果它是 Error 课堂上可能会有问题 JSON.stringify() 那个 res.send 将继续运行,导致未经处理的承诺被拒绝。