【问题标题】:Return promise in node.js在 node.js 中返回承诺
【发布时间】:2021-12-10 11:26:57
【问题描述】:

我尝试从 API 返回 node.js 中的数据,但我遇到了问题,因为我需要一个异步函数,我无法确定正确使用承诺,我已经尝试了一切并且我无法将结果放入返回中,只能在 console.log 中,有人帮助我吗?

const express = require('express')
const MFA = require('mangadex-full-api')

module.exports = {
    async indexManga(req, res) {
         
        const mangalist = MFA.login('DarksGol', 'R@ul1605', './md_cache/').then(async () => {

            manga = []
                await MFA.Manga.search('Kiss').then(results => {
                results.forEach((elem, i) => {   
                    let obj = {}
                    obj.status = elem.status
                    obj.title = elem.title
                    
                    manga.push(obj)
                })
            }).catch(console.error)

            return manga

        }).catch(console.error) 

        console.log(await mangalist)
        return mangalist
    }
}

没有发生错误,只是根据请求无限加载

const express = require('express')
const routes = express.Router()

const searchManga = require('../src/controllers/searchManga')

routes.get('/searchManga', searchManga.indexManga)

module.exports = routes

【问题讨论】:

  • 分享这个导出的require文件代码,这个导出函数的使用
  • 你能告诉我们你是怎么打电话给indexManga的吗?
  • 顺便说一句,我真的希望R@ul1605 不是你的真实密码。如果是,您需要立即更改。
  • 这不是我的密码!我相信问题不在我的索引调用中,因为我已经进行了另一个回调来测试我的路由并且它运行良好,如果问题不是异步的并且等待函数,返回是一个承诺,所以返回尝试在实际完成之前发送一些东西!但我不知道如何解决这个问题!
  • @Raul 不确定 DarksGol 是谁,但他的密码确实有效。你从哪里得到这个代码?向作者报告该事件。

标签: javascript node.js promise return


【解决方案1】:

我不明白为什么这会导致“infinite loading on request”,但您可以将代码大大简化为

const express = require('express');
const MFA = require('mangadex-full-api');

module.exports = {
    async indexManga(req, res) {
        await MFA.login('DarksGol', 'R@ul1605', './md_cache/')
        const mangaList = [];
        const results = await MFA.Manga.search('Kiss');
        results.forEach(elem => {   
            mangaList.push({
                status: elem.status,
                title: elem.title,
            });
        });
        return mangalist;
    },
};

【讨论】:

  • 感谢 Bergi,我也不明白是什么导致了无限加载,但感谢您改进我的代码
【解决方案2】:

看起来indexManga 是一个端点。每个端点函数必须通过发送响应(res.send()、res.json()、res.end() 等)来结束请求-响应周期。如果indexManga 是端点,则解决方案是:

...

//return mangalist
res.send(mangalist)

//return mangalist
res.json({ status: "success", message: "logged in successfully" })

如果是中间件:

async indexManga(req, res, next) {
  ...
  //return mangalist
  return next()
}

编辑:您在某些地方不正确地使用 async/await.then()。 试试这个方法:

module.exports = {
    indexManga(req, res) {
        MFA.login('DarksGol', 'R@ul1605', './md_cache/').then(() => {

            manga = []
            MFA.Manga.search('Kiss').then(results => {
                results.forEach((elem, i) => {   
                    let obj = {}
                    obj.status = elem.status
                    obj.title = elem.title
                    
                    manga.push(obj)
                })
                
                res.json({ status: "success", data: manga })
                
            }).catch((err) => {
               res.json({ status: "fail", error: err })
            })
            

        }).catch((err) => {
           res.json({ status: "fail", error: err })
        })
    }
}

【讨论】:

  • 嗨 ABDULLOKH,你是对的,我最终忘记添加端点,但它不起作用,因为变量试图在它准备好之前发送,所以这不是问题,但实际上我需要在我的代码中添加res.json,谢谢!
  • 谢谢,ABDULLOKH,你的方法很完美,问题解决了:D
猜你喜欢
  • 2017-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-18
  • 2016-06-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多