#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
какого-либо обещания или без него, он возвращает
Обещание {ожидание}