NodeJS Sequelize 从查询返回数据

Posted

技术标签:

【中文标题】NodeJS Sequelize 从查询返回数据【英文标题】:NodeJS Sequelize returning data from query 【发布时间】:2018-09-09 18:31:45 【问题描述】:

javascript 和 Node.js 来说是全新的。我正在尝试将 Sequelize 作为 ORM 开始,并做了一个简单的查询

var employeeList = Employee.findAll().then(function(result)
    console.log(result.length);
    console.log(result[0].employeeName);
    //how do I return this to a variable with which I can do further processing
    return result;
 );

//do something with employeeList
employeeList[0].employeeName //cannot read property of undefined 

虽然控制台日志打印出正确的名称,但employeeList 本身不包含任何数据。我尝试打印employeeList,它显示了承诺

Promise 
  _bitField: 0,
  _fulfillmentHandler0: undefined,
  _rejectionHandler0: undefined,
  _promise0: undefined,
  _receiver0: undefined 

我确实浏览了 Promise 的概念,但无法获得有关如何将 Promise 的结果返回到函数外部的变量的东方示例。我认为返回结果会起到作用。我在这里错过了什么吗?我可以理解我可以在 promise 函数中处理结果。如果场景是进行两次数据库调用,然后处理两次调用的结果以返回合并结果,如何在不将结果传递给变量的情况下完成。

【问题讨论】:

【参考方案1】:

因此,根据您关于使用独立查询的 cmets 的帖子,我想向您展示如何正确使用它们:

//Each request in it's own function to respect the single responsability principle 
function getAllEmployees() 
  return Employee
    .findAll()
    .then(function(employees)
      //do some parsing/editing
      //this then is not required if you don't want to change anything
      return employees;
     );


function doAnotherJob() 
  return YourModel
    .findAll()
    .then(function(response) => 
      //do some parsing/editing
      //this then is not required if you don't want to change anything
      return response;
    );


function do2IndependentCalls() 
  return Promise.all([
    getAllEmployees(),
    doAnotherJob()
  ]).then(([employees, secondRequest]) => 
    //do the functionality you need
  )

【讨论】:

【参考方案2】:

另一种方法是使用 async await

async function getEmployees()
    var employeeList = await Employee.findAll().then(function(result)
        console.log(result.length);
        console.log(result[0].employeeName);
        return result;
    );

    employeeList[0].employeeName;

【讨论】:

【参考方案3】:

then 方法返回一个 Promise,而不是您的员工列表。

如果您想使用员工列表,您应该在传递给现有then 调用的函数中执行此操作,或者在随后的then 调用中执行此操作,如下所示。

Employee
  .findAll()
  .then(function(el)
    console.log(el.length);
    console.log(el[0].employeeName);
    return el;
   )
  .then(function(employeeList)
    //do something with employeeList
    employeeList[0].employeeName
   );

【讨论】:

如果我需要处理两个独立查询的结果怎么办?我是否需要在 thens 中菊花链查询,即第二个查询发生在第二个 then 内? 没有必要在同一个 Promise 链中处理 2 个真正独立的查询,只要这 2 个查询可以相互异步处理即可。

以上是关于NodeJS Sequelize 从查询返回数据的主要内容,如果未能解决你的问题,请参考以下文章

使用 Sequelize (NodeJS) 而不是 * 指定特定字段

如何使用nodejs sequelize执行此SQL查询?

用nodejs sequelize中指定的字段隐藏db中的一个结果。

sequelize.query() 两次返回相同的结果

nodejs使用Sequelize框架操作数据库

Nodejs ORM框架Sequelize快速入门