express js中的AXIOS return Promise { undefine }

ljo96ir5  于 2023-06-22  发布在  iOS
关注(0)|答案(3)|浏览(111)

我新学习expressjs和axios
我创建了一个文件夹utils并将axios.js文件

const axios = require('axios');

loadDataPesan=async function(opts){
    
    axios.get('localhost/getData', {
        params: {
          opt: opts,
          nis: "123123",
        }
      })
      .then(function (response) {
        console.log(response.data.datas) // ITS NORMALLY SHOW THE CORRECT DATA 
        return response.data.datas; // HERE MY PROBLEM, WHEN I RETURN IT DATA always Promise { }
      })
      .catch(function (error) {
        return error; 
      });
}

module.exports = { loadDataPesan };

这里是我的app.js文件

const express = require('express');
const expressLayout = require('express-ejs-layouts');
const { loadContact } = require('./utils/contact');
const { loadDataPesan } = require('./utils/axios');
const app = express();
const port = 8899;

app.set('view engine', 'ejs');
app.use(expressLayout);

// BUILTIN MIDDLEWARE
app.use(express.static('public'));

app.get('/contact', (req, res) => {
    const contacts  = loadContact();
    const dataaxio = loadDataPesan("SUBS","912830123");

    
    console.log(dataaxio); // **HERE MY PROBLEM RESPONSE ALWAYS Promise { }**
    
    res.render('contact', { 
        layout: 'layouts/main-layout',
        title: 'Halaman Contact',
        contact:contacts,
    });
})

如果有人能帮我,我先谢谢你
我尝试在函数中给定异步,但它也是一样的,我尝试回调响应它也是一样的

9udxz4iz

9udxz4iz1#

使用async/await等待结果。您可能需要捕获错误。

app.get('/contact', async (req, res) => {    <-- convert it to async function
    const contacts  = loadContact();
    const dataaxio = await loadDataPesan("SUBS","912830123");  <-- await for response

    
    console.log(dataaxio); 
    
    res.render('contact', { 
        layout: 'layouts/main-layout',
        title: 'Halaman Contact',
        contact:contacts,
    });
})

并从loadDataPesan函数返回数据

loadDataPesan = async function(opts) {
  try {
    const response = await axios.get('localhost/getData', {
      params: {
        opt: opts,
        nis: "123123",
      }
    });

    console.log(response.data.datas); // Log the correct data
    return response.data.datas; // Return the data

  } catch (error) {
    console.error(error);
    throw error; // Throw the error to be caught by the caller
  }
}
jljoyd4f

jljoyd4f2#

我看到你的代码中有两个问题。
首先,你不需要await来返回任何东西。
这意味着当

console.log(dataaxio);

但承诺还没有解决。如果将调用此函数的函数设置为async函数,则可以在调用loadDataPesan函数之前添加await。这将停止执行代码,直到loadDataPesan中的promise被解析

async (req, res) => {
    const contacts  = loadContact();
    const dataaxio = await loadDataPesan("SUBS","912830123");
 // ...

其次,在loadDataPesan中实际上并不返回任何内容。在promise的回调中确实有一个return语句(then方法中的函数),但是根本没有返回promise。
要解决这个问题,只需在调用axios之前添加一个return

const axios = require('axios');

loadDataPesan=async function(opts){
    return axios.get('localhost/getData', {
        params: {
          opt: opts,
          nis: "123123",
        }
      })
     // ...
}

module.exports = { loadDataPesan };
6ie5vjzr

6ie5vjzr3#

有几个问题我可以看到->
1.在axios.js文件中,这一行

loadDataPesan=async function(opts)

您没有使用推荐的const关键字。这样写->

const loadDataPesan = async function(opts) {
  // Function body
};

或者这样->

async function loadDataPesan(opts) {
  // Function body
}

1.导出单个函数时,如下导出->

module.exports = loadDataPesan;

1.正如在其他答案中指出的,如果你在函数的顶部使用using async关键字,请使用async/await语法。将代码 Package 在try-catch块中也是一个很好的做法,可以更好地处理错误。下面是一个如何重构代码的示例,我使用了express模块的Router方法进行路由。您可以在express.Router部分了解更多关于here的信息。
axios.js文件

const axios  = require("axios");
const express = require("express");
const router = express.Router();

router.get("/", async (req, res) => {
  try {
    const resp = await axios.get(
      "a_url_path"
    );
    res.send(resp.data);
  } catch (error) {
    res.send(error.message);
  }
});

module.exports = router;

app.js文件->

const express = require("express");
const app = express();
const bodyParser = require("body-parser");
const axiosFile = require("./axios");

//other code....

app.use("/data", axiosFile);

// other code...

app.listen(5000, () => {
  console.log("Listening on port 5000");
});

相关问题