【问题标题】:Debugging await and async function for Express.js调试 Express.js 的 await 和 async 函数
【发布时间】:2021-03-10 01:33:16
【问题描述】:

我想用这样的方式创建一个数组

[{
"item":"item1",
"subitem":[{"subitem1","subitem2"}]
},{
"item":"item2",
"subitem":[{"subitem3","subitem4"}]
}]

我已连接到 mysql RDS 并尝试执行一些查询。 我使用无服务器框架的 express js 代码如下:

app.get('/modules/all', function async(req, res) {
    let data = await run();
    res.send(data);
})


async function run() {
    return new Promise((resolve, reject) => {
        con.query('SELECT `module_name` FROM `module_master` GROUP BY `module_name`', (err, rowsmod) => {
            if (err) throw reject(err);
            var rowdata = [];
            for (var j = 0; j < rowsmod.length; j++) {
                var modulenames = rowsmod[j].module_name;
                let resModule = await getSubmodule(modulenames);
                console.log(resModule);
                resModule = JSON.parse(resModule);
                rowdata.push({
                    "module": modulenames,
                    "submodule": resModule
                });
            }
            resolve(rowdata);
        })
    });
}


async function getSubmodule(modulenames) {
    return new Promise((resolve, reject) => {
        con.query('SELECT * FROM `module_master` WHERE `module_name` = ?', [modulenames], (err, rows) => {
            if (err) throw reject(err);
            resolve(rows);
        });
    })
};

await 获得的错误仅在 async 函数中有效,但 async 已经定义。为什么我会遇到这个问题?

E: \serverless\ index.js: 122
let data = await run(); 
         ^ ^ ^ ^ ^

SyntaxError: await is only valid in async function
at compileFunction( < anonymous > )
at wrapSafe(internal / modules / cjs / loader.js: 1053: 16)
at Module._compile(internal / modules / cjs / loader.js: 1101: 27)
at Object.Module._extensions..js(internal / modules / cjs / loader.js: 1157: 10)
at Module.load(internal / modules / cjs / loader.js: 985: 32)
at Function.Module._load(internal / modules / cjs / loader.js: 878: 14)
at Module.require(internal / modules / cjs / loader.js: 1025: 19)
at require(internal / modules / cjs / helpers.js: 72: 18)
at E: \serverless\ express\ aipersonalization\ node_modules\ serverless - offline\ dist\ lambda\ handler - runner\ in -process - runner\ InProcessRunner.js: 145: 133
at processTicksAndRejections(internal / process / task_queues.js: 97: 5)
at InProcessRunner.run(E: \serverless\ express\ aipersonalization\ node_modules\ serverless - offline\ dist\ lambda\ handler - runner\ in -process - runner\ InProcessRunner.js: 145: 9)

【问题讨论】:

标签: javascript node.js express asynchronous async-await


【解决方案1】:

您应该 promisify 仅在单独的方法中调用 con.query,并且不要将 rowsmod 的处理混入 new Promise 构造函数中:

function query(con, ...args) {
    return new Promise((resolve, reject) => {
        con.query(...args, (err, rows) => {
            if (err) reject(err); // no `throw` here!
            else resolve(rows);
        });
    });
}

然后,您可以在业务逻辑中使用该辅助函数并await 其结果:

function getSubmodule(modulenames) {
    return query(con, 'SELECT * FROM `module_master` WHERE `module_name` = ?', [modulenames]);
}

async function run() {
    const rowsmod = await query(con, 'SELECT `module_name` FROM `module_master` GROUP BY `module_name`')
    const rowdata = [];
    for (var j = 0; j < rowsmod.length; j++) {
        const modulename = rowsmod[j].module_name;
        let resModule = await getSubmodule(modulename);
        rowdata.push({
            "module": modulename,
            "submodule": resModule,
        });
    }
    return rowdata;
}

app.get('/modules/all', function (req, res) {
    run().then(data => {
        res.send(data);
    }, err => {
        res.status(500).send('Sorry.');
    });
})

【讨论】:

  • 你没有像第一个sn-p那样定义query吗?
  • 我之前没有取消该功能,现在它可以工作了,我已经添加了它现在工作正常,感谢您的宝贵时间和帮助。
  • @RoniModak 很高兴有帮助!你可能想accept the answer
猜你喜欢
  • 2019-02-17
  • 2019-07-24
  • 2021-08-06
  • 2017-12-17
  • 1970-01-01
  • 2020-09-22
相关资源
最近更新 更多