Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/465.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript NodeJS Express app await仅在异步函数中有效,但这显然是异步函数?_Javascript_Node.js_Express_Async Await - Fatal编程技术网

Javascript NodeJS Express app await仅在异步函数中有效,但这显然是异步函数?

Javascript NodeJS Express app await仅在异步函数中有效,但这显然是异步函数?,javascript,node.js,express,async-await,Javascript,Node.js,Express,Async Await,我做了一个函数来检查数据库中是否已经存在某个东西。我只是简单地复制粘贴了用于在数据库中获取内容的逻辑,并更改了查询对象+返回的内容。但现在看来node不喜欢这样,只是抛出了一个对我来说毫无意义的错误 在这里我调用函数: let exists = await queryDatabaseExists(uniqueQuery, res); 我正在调用的函数: async function queryDatabaseExists(queryParam, res) { try {

我做了一个函数来检查数据库中是否已经存在某个东西。我只是简单地复制粘贴了用于在数据库中获取内容的逻辑,并更改了查询对象+返回的内容。但现在看来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}`);
    }
}

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

queryDatabaseExists函数需要返回承诺,否则无法使用wait

wait命令期望函数返回一个承诺

它必须在异步内部。 例:


wait只能在异步函数中使用。对于您想要等待uniquequery结果的场景。首先,您必须在router.post回调中进行更改,如router.post('/url',async(req,res)=>{})用于对checkifexist函数进行synchornus调用。其次,为了在checkifexist函数中使用wait,您必须将checkisexist函数更改为异步函数checkifexist(){}。第三,在调用checkifexist函数-->让result=await checkifexist()时,您希望等待已使用的DB响应。您可以查看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);
});

是函数,该函数的作用是:this
let exists=await queryDatabaseExists(uniqueQuery,res)
也是异步的吗?@AdamH我不明白你的问题你有一行
let exists….
是在函数中吗?不,我试图将异步函数的结果存储为布尔值;很可能是在非异步函数中定义了变量“exists”。使该函数异步,它就会解决这个问题。嗯,我想调用查询并将结果(True或false)存储在“exists”变量中,然后在执行后运行一些代码。如果我不使用wait,它似乎只是将defautl改为“promise”,其余的代码就不起作用了。我是否应该将等待函数包装在一个只调用该函数的整个其他函数中?async/await的前提是使所有相关函数都是异步的(或者像在应用程序的某些部分中一样使用promise API)。有什么原因不能使外部函数异步吗?Express支持它,我尝试使用'let exists=checkIfExists();函数checkIfExists(){result=await queryDatabaseExists(uniqueQuery,res);返回结果};console.log(存在);`同样的结果令人遗憾。现在这很奇怪。
函数checkIfExists()
应该是
异步函数checkIfExists()
@AdamH好的,我这样做了,但是当我试图定义变量时,我遇到了同样的问题。如果我不等待那个承诺的结果,那么“存在”在任何地方都被用作“等待承诺”。然后,如果我尝试等待该函数,控制台上也会出现相同的结果。谢谢,由于express的一些问题,我最终以不同的方式对其进行了重构,并将我的主查询函数拆分为4个异步函数流,这样我的路由就不会一团糟。但是你的解决方案马上就成功了!
app.post('/', async (req, res) => {
  let exists = await queryDatabaseExists(uniqueQuery, res);
});
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);
});