#javascript #node.js #express
#javascript #node.js #экспресс
Вопрос:
Я использую node.js экспресс-фреймворк для создания REST API и пытаюсь преобразовать мой код из обратных вызовов в методы Async / Await с помощью basic .then() promise с использованием artical . таким образом, при реализации кода ошибка возникает как SyntaxError: await is only valid in async function
Я новичок в javascript и не понимаю, что вызывает эту проблему. У меня ниже структура папок
MAIN APP
├── app.js
├── controllers
│ └── UserController.js
├── routes
│ └── User.js
└── util
├── AuthUtil.js
├── Helpers.js
├── RestUtil.js
└── wallet.js
Моя внутренняя функция контроллера API приведена ниже
Getone: async (req, res, next) => {
try {
MongoClient.connect(config.Database.DFARM.connectString, function(err, client) {
assert.equal(null, err);
const db = client.db(config.Database.DFARM.dbName);
console.log('********db**********',db)
//Step 1: declare promise
var myPromise = () => {
return new Promise((resolve, reject) => {
db
.collection('User')
.find(query)
.limit(1)
.toArray(function(err, docs) {
err
? reject(err)
: resolve(docs[0]);
});
});
};
//await myPromise
var result = await myPromise();
//continue execution
client.close();
console.log('********result**********',result)
// res.json(result);
}); //end mongo client
} catch (e) {
next(e)
}
}
Мой маршрутизатор
router.get('/getone/:id', function (req, res, next) {
controller.Getone(req, res, next);
});
Ответ №1:
Итак, в основном вложенная функция не является асинхронной. итак, вам нужно:
async function(err, client) {/* your code */}
Кстати, почему вы создаете новое обещание внутри асинхронной функции?
вы можете просто выполнить следующее:
Getone: async (req, res, next) => {
try {
const client = await MongoClient.connect(config.Database.DFARM.connectString)
const db = client.db(config.Database.DFARM.dbName);
const result = await db
.collection('User')
.find(query)
.limit(1)
.toArray(function(err, docs) {
err
? reject(err)
: resolve(docs[0]);
});
});
// do something with result..
client.close();
console.log('********result**********',result)
} catch (error) {
// handle error
}
};
Комментарии:
1. Спасибо @Yakir за предложение и помощь
Ответ №2:
Функция «function (err, client)» не является асинхронной, и вы используете await внутри. Итак, вы получаете эту ошибку. Попробуйте «асинхронная функция (ошибка, клиент)»