NodeJS Express 应用程序中,await 只能在异步函数中使用,但这明显是异步函数?

3
我已经编写了一个函数来检查数据库中是否存在某个特定的东西。我只是复制粘贴了获取数据库中某些内容的逻辑,并更改了查询对象和返回内容。但现在似乎node不喜欢这样做,只是抛出一个对我来说毫无意义的错误。
调用该函数的位置:
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}`);
    }
}

很可能您在某个非异步函数内定义了变量'exists'。将该函数改为异步函数,问题应该就会解决。 - dev
这正是我想表达的。 - Adam H
@DanielVarela 我已将其重命名为无意义的东西,令人困惑的是,我得到了完全相同的结果。我也没有试图对其进行任何其他操作,只是在控制台上记录它。 - SebastianG
我认为你误解了Daniel和我所问的问题。请展示一下let exists = await ...周围的代码。 - Adam H
router.post("/admin/category", (req, res) => { should be router.post("/admin/category", async (req, res) => { - Adam H
显示剩余9条评论
4个回答

7

必须放在 async 内。

app.post('/', async (req, res) => {
  let exists = await queryDatabaseExists(uniqueQuery, res);
});

谢谢!由于Express存在一些问题,我不得不以不同方式对其进行重构,并将我的主要查询函数分成了4个异步函数的流程,这样我在路由中就不会乱了。但你的解决方案立即奏效了! - SebastianG

0

queryDatabaseExists函数需要返回Promise,否则无法使用await。

await命令期望函数link返回一个Promise。

let exists = await queryDatabaseExists(uniqueQuery, res);

0

await 只能在异步函数中使用。对于您的情况,您想要等待来自 uniquequery 的结果。首先,您必须更改路由器的 router.post('/url',async(req,res)=>{}); 回调,以便对 checkifexist 函数进行同步调用。其次,为了在 checkifexist 函数中使用 await,您必须更改 checkisexist 函数为 async function checkifexist(){}。第三,您想要等待 DB 响应,因此在调用 checkifexist 函数时必须使用 await --> 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
这意味着调用 queryDatabaseExists 的函数也必须是异步的,以便在其中使用 await 关键字。queryDatabaseExists 函数本身看起来是正确的。

嗯,我想调用查询并将结果(True或false)存储在“exists”变量中,然后运行一些代码。如果我不使用await,它似乎只是默认为“promise”,其余的代码就无法工作。我应该将等待函数包装在一个完全调用该函数的其他函数中吗? - SebastianG
async/await 的前提是将所有相关函数设置为异步(或在应用程序的某些部分仍使用 Promise API)。你不能将外部函数设置为异步吗?Express 完全支持它。 - Jonas Høgh
我尝试使用 `let exists = checkIfExists();function checkIfExists() { result = await queryDatabaseExists(uniqueQuery, res); return result} ;console.log(exists);`,但结果仍然相同。现在这非常奇怪。 - SebastianG
function checkIfExists() should be async function checkIfExists() - Adam H
@AdamH 好的,我做到了,但是当我尝试定义变量时,我遇到了同样的问题。如果我不等待那个 Promise 的结果,exists 就会被用作 Promise Pending。然后,如果我尝试等待那个函数,控制台上会出现相同的结果。 - SebastianG
@SabastianG,请查看我在你的问题上的评论。 - Adam H

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接