【问题标题】:Unable to return response of mongoDB save call to frontend无法将 mongoDB 保存调用的响应返回到前端
【发布时间】:2020-09-29 19:28:58
【问题描述】:

我是 NodeJS 的新手,正在学习如何进行数据库调用。

我的数据库调用正在运行,保存数据的请求反映在数据库中。我想将 save call 的响应发送给客户端(前端)

但我无法返回回复。 await 似乎在 file1 中不起作用。

感谢任何帮助或参考。

我的代码

file1 与 DB 连接并调用具有保存调用的 file2

app.post('/',async (req,res) =>{
    try{
        const val = await gameEngine.processRequest(req.body,res);
       console.log(val) // prints { status: 'READY', token: Promise { <pending> } }
        res.json(val);
    } catch(err) {
        res.json({message:err });
    }
});

进行保存调用的文件 2

async function processRequest(body,res){
    if(body.Request === "START")
    {
        return await {"status":"READY", "token":getNewDBToken(res)};
    }
    return {"status":"Invalid"};
}
async function getNewDBToken(res) {
    try{
        const status = new statusDataBase({gameStatus: createBoard()});
        const saved = await ((status.save()));
        console.log(saved);   // prints the response as expected.
        return await saved;
    }
    catch(err)
        {res.json({message: "err1"});}
}

注意到虽然 file2 中的 console.log 被首先调用,但它在 file1 的控制台日志之后被记录。

【问题讨论】:

  • 已尝试在所有地方使用 await。
  • 已经通过this,但无法解决问题。

标签: node.js mongodb express


【解决方案1】:

应该是这样的。

return {"status":"READY", "token": await getNewDBToken(res)};

await 只等待承诺,而不是包含承诺作为属性的对象。

async function run() {
  const wrong = await {
    test: delay(1000, 'wrong'),
    wrong: true,
  };
  console.log(wrong)

  const right = {
    test: await delay(500, 'right'),
    right: true,
  }
  console.log(right)
}

run();




function delay(ms, value) {
  return new Promise(r => setTimeout(r, ms, value)).then(x => { console.log(`Value ${value} returned after ${ms} ms.`); return x;})
}

【讨论】:

  • 谢谢,它成功了。 'await' 必须放在 2 行中,一个在您发布的行中。第二行“await gameEngine.processRequest(req.body,res);”文件 1.
  • @DarshanKN 从技术上讲,您可以将 await 放置在您想要的任何地方。例如const a = [ await 1, await 2, await 3, {[await 'name']: await 'value'}] 是有效的 js。但它仅在应用于“thenable”值(最常见的 Promise)时才有意义
  • 我不会返回数据库响应,除非“await”在“await gameEngine.processRequest(req.body, res);”这一行中
【解决方案2】:

在文件 2 中

试试这样,

async function processRequest(body,res){
    if(body.Request === "START")
    {
       let newToken = await getNewDBToken(res)
        return await {"status":"READY", "token":newToken};
    }
    return {"status":"Invalid"};
}
async function getNewDBToken(res) {
    try{
        const status = new statusDataBase({gameStatus: createBoard()});
        const saved = await ((status.save()));
        console.log(saved);   // prints the response as expected.
        return await saved;
    }
    catch(err)
        {res.json({message: "err1"});}
}

注意:当您在没有 await 或任何 Promise 的情况下调用 Async function 时,它会返回 承诺{待处理}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-28
    • 2019-03-27
    • 2013-08-23
    • 2020-11-04
    • 1970-01-01
    • 2018-03-28
    • 2014-09-14
    • 1970-01-01
    相关资源
    最近更新 更多