Приложение NodeJS Express ожидает только в асинхронной функции, но это явно асинхронная функция? - PullRequest
0 голосов
/ 25 октября 2018

Я сделал функцию, чтобы проверить, существует ли определенная вещь в базе данных.Я просто скопировал и скопировал логику, которую я использую, чтобы получить что-то в базе данных, и изменил объект запроса + то, что возвращается.Но теперь кажется, что ноду это не нравится и просто выдает ошибку, которая не имеет смысла для меня.

Где я вызываю функцию:

let exists = await queryDatabaseExists(uniqueQuery, res);

Функция, которую яВызов:

async function queryDatabaseExists(queryParam, res) {
    try {
        const cp = new sql.ConnectionPool(config);
        await cp.connect();
        let result = await cp.request().query(queryParam);
        if(result.recordset.rowsAffected[0] = 1){return true} else { return false }
    } catch (err) {
        res.status(520).send(`Database error: ${err}`);
    }
}

Ошибка, которую я получаю:

let exists = await queryDatabaseExists(uniqueQuery, res);
             ^^^^^

SyntaxError: await is only valid in async function

ВСЕ код для этого маршрута:

router.post("/admin/category", (req, res) => {

    uniqueQuery = `SELECT [name] from [dbo].[idtTV_categories] WHERE [name] = '${req.body.name}'`

    getQuery = `SELECT [id]
    ,[name]
    ,[description]
    ,[created_time]
    ,[created_by] from [dbo].[idtTV_categories]`

    standardQuery = `INSERT INTO [dbo].[idtTV_categories] ([name],[description],[created_time],[created_by]) 
    VALUES 
    ('${req.body.name}', 
    '${req.body.description}',
    SYSDATETIME(),
    '${req.user.name}')`;

    let exists = checkIfExists();

    function checkIfExists() { result = await queryDatabaseExists(uniqueQuery, res); return result} ;

    console.log(exists);

    if(req.user.roles.some(role => role === admin || role === editor)){
        if(!existsInDatabase){
        if(queryDatabase(standardQuery, res)){queryDatabase_get(getQuery, res)}
    }
}

    else { res.statusMessage = `${req.user.name} is not authorized to add categories.`;
           console.log(req.user.roles)
           res.status(520).send() };

})

Все вызываемые функции:

///////////// MAIN QUERYING FUNCTION //////////////////////
async function queryDatabase_get(queryParam, res) {
    try {
        const cp = new sql.ConnectionPool(config);
        await cp.connect();
        let result = await cp.request().query(queryParam);
        res.send(result.recordset);
    } catch (err) {
        res.status(520).send(`Database error: ${err}`);
    }
}

async function queryDatabaseExists(queryParam, res) {
    try {
        const cp = new sql.ConnectionPool(config);
        await cp.connect();
        let result = await cp.request().query(queryParam);
        if(result.recordset.rowsAffected[0] = 1){return true} else { return false }
    } catch (err) {
        res.status(520).send();
    }
}

async function queryDatabase(queryParam, res) {
    try {
        const cp = new sql.ConnectionPool(config);
        await cp.connect();
        let result = await cp.request().query(queryParam);
        if(result.rowsAffected > 0){ return true }
    } catch (err) {
        res.status(520).send(`Database error: ${err}`);
    }
}

Ответы [ 4 ]

0 голосов
/ 25 октября 2018

await можно использовать только в асинхронной функции.Для вашего сценария вы хотели дождаться результата от уникального запроса.Сначала вы должны внести изменения в ваш обратный вызов router.post, например router.post ('/ url', async (req, res) => {}); для выполнения синхорнусного вызова checkifexist функция.Во-вторых, чтобы использовать await в функции checkifexist, вы должны внести изменения в функцию checkisexist в async function checkifexist () {} .В-третьих, вы хотели дождаться ответа БД, для которого вы используете await при вызове функции checkifexist -> let result = await checkifexist () .Вы можете проверить сайт MDN для лучшего понимания.

router.post('url',async(req,res)=>{// in order to use await in checkifexist
//your rest of the code.
let result=await checkifexist();// waiting for db result
async function checkifexist(){//your awaited code.}
console.log(result);
});
0 голосов
/ 25 октября 2018

Функция queryDatabaseExists должна возвращать обещание, если вы не можете использовать await

Команда await ожидает возврата обещания функцией link

let exists = await queryDatabaseExists(uniqueQuery, res);
0 голосов
/ 25 октября 2018

должно быть внутри асинхронно.например:

app.post ('/', async (req, res) => {

пусть существует = await queryDatabaseExists (uniqueQuery, res);

});

0 голосов
/ 25 октября 2018

Это означает, что функция, в которой выполняется вызов queryDatabaseExists, также должна быть асинхронной, чтобы использовать ключевое слово await внутри нее.Сама функция queryDatabaseExists выглядит корректно.

...