Javascript-如何将我用来查询数据库的承诺中的变量发送到前端?

时间:2018-12-03 18:05:43

标签: javascript sql-server promise

这是我使用的承诺。我还使用了node-mssql软件包。

const loadpictures = () => {
    sql.connect(config).then(pool => {
    return pool.request()
    .query('SELECT Top 20 PhotoURL As src, PostURL As link from Valley_Photos FOR JSON PATH')

    }).then((result) => {
            //console.dir(result);
            sql.close();
            return result['result'].typeOf();

        }).catch(err => {
           console.log(err)
           sql.close();

        })
}

loadpictures()
.then(result => console.log(results))
.catch( err => ErrorHandler(err) );

我得到的错误是:

TypeError: Cannot read property 'then' of undefined

console.dir输出所需的json对象。我只是不知道如何将其拔出。 我在做什么错了?

2 个答案:

答案 0 :(得分:0)

您不会从loadpictures函数返回任何诺言,因此,您不能在主体中使用then语句。

返回与async/await一起使用的第二个承诺很容易:

const loadpictures = async () => {
    let pool = await sql.connect(config);
    let req = pool
      .request()
      .query('SELECT Top 20 PhotoURL As src, PostURL As link from Valley_Photos FOR JSON PATH')

     req.then((result) => {
            //console.dir(result);
            sql.close();
            return result['result'].typeOf();

        }).catch(err => {
           console.log(err)
           sql.close();

        })

     return req;
}

loadpictures()
.then(result => console.log(results))
.catch( err => ErrorHandler(err) );

另一方面,仅使用promise更为冗长,因为您必须返回一个新的promise,该promise将以result解析,并以err拒绝:

const loadpictures = () => {
    return new Promise((resolve, reject) => {
        sql.connect(config).then(pool => {
            return pool.request()
              .query('SELECT Top 20 PhotoURL As src, PostURL As link from Valley_Photos FOR JSON PATH')

        }).then((result) => {
           //console.dir(result);
           sql.close();
           resolve(result)
        }).catch(err => {
           console.log(err)
           sql.close();
           reject(err);
        })
    }
}

loadpictures()
.then(result => console.log(results))
.catch( err => ErrorHandler(err) );

答案 1 :(得分:0)

then未定义,因为您没有从函数中返回承诺。如果您不需要使用sql.close(),则可以简单地从函数中返回sql,因为它可以返回一个promise的函数,但是既然如此,您可以将sql调用包装在promise中并解决/拒绝结果/错误。

function loadpictures() {
  return new Promise((resolve, reject) => {
    sql
      .connect(config)
      .then(pool => {
        return pool.request().query(query)
      })
      .then(result => {
        sql.close();
        resolve(result['result'].typeOf());
      })
      .catch(err => {
        sql.close();
        reject(err);
      });
  });
}

loadpictures()
  .then(result => console.log(result))
  .catch(err => ErrorHandler(err));