Невозможно вернуть ответ на вызов сохранения MongoDB во внешний интерфейс

#node.js #mongodb #express

#node.js #mongodb #экспресс

Вопрос:

Я новичок в NodeJS и изучаю, как выполнить вызов DB.

Мой вызов БД работает, и запрос на сохранение данных отражается в БД. Я хочу отправить ответ на вызов сохранения клиенту (интерфейсу)

Но я не могу вернуть ответ. Ожидание, похоже, не работает в file1.

Любая помощь или ссылка приветствуются.

Мой код

файл1 с подключением к БД и вызовом 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, он регистрируется после журнала консоли file1.

Комментарии:

1. пробовал использовать await во всех местах.

2. прошел через это , но не смог понять проблему.

Ответ №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;})
}  

Комментарии:

1. Спасибо, это сработало. ‘await’ нужно было поместить всего в 2 строки, одну в строке, опубликованной вами. Второй в строке «ожидает GameEngine.ProcessRequest (req.body, res);» файла 1.

2. @DarshanKN Технически вы можете разместить await где угодно. Например const a = [ await 1, await 2, await 3, {[await 'name']: await 'value'}] , допустимый js. Но это имеет смысл только при применении к значению «thenable» (наиболее распространенное обещание)

3. I не возвращает ответ БД, если только «await» не находится в строке «await GameEngine.ProcessRequest (req.body, res);»

Ответ №2:

В File2

попробуйте так,

 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"});}
}
  

Примечание: когда вы вызываете Async function без await какого-либо обещания или без него, он возвращает
Обещание {ожидание}