【问题标题】:Async post function in NodeJSNodeJS中的异步发布功能
【发布时间】:2023-03-20 12:32:01
【问题描述】:

我正在尝试查询 mssql 数据库以获取用户的密码,即发送 post 请求,然后将其显示在控制台中。但是我所做的承诺并没有按照我想要的方式工作,并且密码没有加载到变量中。这是我的代码:

app.post('/test', function () {
    let user = 'User';
    let query = 'SELECT [Password] as password FROM [Table] where [User] = ' + SqlString.escape(user);

    let password = (async function () {
        try {
            let pool = await sql.connect(dbConfig);
            let result = await pool.request()
                .query(querys);
            console.dir(result.recordset[0].password) //Value here is OK
            return result.recordset[0].password
        } catch (err) {
            // ... error checks
        }
    })()
    console.log(password); //here I am getting "Promise { pending }"
});

我得到的结果是:Promise { pending } '数据库密码'

【问题讨论】:

  • let password = await (async function() {...} ()) 当您使用 async 创建承诺时,您需要为它使用 await
  • 视为您使用async,只需将app.post 标记为async 方法,然后您就可以从一开始就使用await..app.post('/test', async function () { 不需要匿名函数。
  • 这仅在使用的 Web 框架支持异步中间件处理程序时才有效。 Express 不支持,但我认为。 Koa 确实如此。
  • 它与express 一起工作正常。Promise 被忽略,你只需处理里面的错误,..我会发布一个例子..
  • 不过,使用 Koa,您实际上可以将异步回调分配为中间件,而不必像这样进行显式错误捕获,并且通用错误处理中间件将为您处理它,因为 Koa 本身支持 async/await。

标签: javascript node.js ecmascript-6 promise


【解决方案1】:

这里是使用async / await 和 express 的示例。

Express 不处理错误,但你可以自己处理它们并没有什么大问题,你甚至可以封装到一个通用的错误处理程序中以使事情变得更容易。

无论如何,您的代码已修改为在 express 中使用async/await

app.post('/test', async function (req, res) {
  try {  
    const user = 'User';
    const query = 'SELECT [Password] as password FROM [Table] where [User] = ' + SqlString.escape(user);
    const pool = await sql.connect(dbConfig);
    const result = await pool.request()
      .query(querys);
    const password = result.recordset[0].password;
    console.log(password);
    res.end(password);
  } catch (e) {
    res.end(e.message || e.toString());
  }
});

【讨论】:

  • 是否会在 promise 内表达传播错误?
  • 正在处理错误,所以没有什么可以传播的。如果你愿意,你可以用错误处理做更多花哨的事情。你甚至可以做async function (req, res, next) 并调用next(err) 推送到下一个处理程序..
【解决方案2】:

标记为async 的函数返回一个承诺。这是对未来解决方案(值或错误)的包装。返回 promise 的函数(async 函数会自动执行)要么必须通过链接 .then(..) 或通过使用 await“解包”它来解析为 promise。

在其代码awaitsasync 函数中某处的函数本身必须是async。这意味着任何调用该函数的函数都需要等待它或将其解析为 Promise 等等。

【讨论】:

    【解决方案3】:

    在使用 MongoDB 数据库时遇到了同样的问题,只是通过在函数中添加关键字 async 使 post 请求异步:

    app.post('/register', async function(req,res){
      const myData = {username: req.body.name}
      const doesUserExists = await UserModel.exists(myData)
    })
    

    【讨论】:

      猜你喜欢
      • 2020-04-17
      • 2021-08-05
      • 1970-01-01
      • 2018-01-15
      • 2019-01-12
      • 2019-01-02
      • 1970-01-01
      • 2019-01-01
      • 1970-01-01
      相关资源
      最近更新 更多