NodeJS Express应用等待仅在异步功能中有效,但这显然是异步功能吗?

时间:2018-10-25 15:39:07

标签: javascript node.js express async-await

我已经创建了一个函数来检查数据库中是否已经存在某些东西。我只是简单地复制粘贴了用于在数据库中获取内容并更改查询对象+返回内容的逻辑。但是现在看来,节点不喜欢这样,只是抛出了一个对我来说毫无意义的错误。

我在哪里调用函数:

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 :(得分:3)

它必须在异步内部。 例如:

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

让存在=等待queryDatabaseExists(uniqueQuery,res);

});

答案 1 :(得分:0)

这意味着在其中执行queryDatabaseExists的调用的函数也必须是异步的,以便在其中使用await关键字。 queryDatabaseExists函数本身看起来正确。

答案 2 :(得分:0)

queryDatabaseExists函数需要返回promise,否则您将无法使用await

await命令期望一个承诺将由函数link返回

let exists = await queryDatabaseExists(uniqueQuery, res);

答案 3 :(得分:0)

等待只能在异步功能中使用。对于您的方案,您想等待uniquequery的结果。首先,您必须在router.post回调中进行更改,例如 router.post('/ url',async(req,res)=> {}); ,以便对 Checkifexist 功能。其次,为了在checkifexist函数中使用 await ,您必须将checkisexist函数更改为 async function checkifexist(){} 。第三,您要等待数据库响应,因为您在调用checkifexist函数-> let result = await checkifexist()时使用了 await 。您可以访问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);
});
相关问题