NodeJS中的异步发布功能

时间:2018-01-23 14:54:07

标签: javascript node.js ecmascript-6 promise

我正在尝试查询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} ' DatabasePassword'

3 个答案:

答案 0 :(得分:2)

以下是将async / await与快递一起使用的示例。

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());
  }
});

答案 1 :(得分:0)

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

在其代码asyncasync函数中某处的函数本身需要public void TestMethod1() { Assert.IsFalse(false); } 。这意味着无论函数需要等待它还是将其解析为承诺等等。

答案 2 :(得分:0)

使用MongoDB数据库时遇到相同的问题,只是通过向函数添加关键字 async 来使发布请求异步:

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