node.js - 访问 Sequelize 模型上的单个字段

标签 node.js sequelize.js

Sequelize 的新手。 SQLite 数据库已创建并正在运行。使用这样的示例:

const Sequelize = require('sequelize')

const sequelize = new Sequelize('sqlite:dbname.db');

sequelize.authenticate()
  .then(() => {
    console.log('Connected')
  })
  .catch(err => {
    console.log('Not connected')
  })

  const User = sequelize.define('users', {
  id: {type: Sequelize.SMALLINT, primaryKey: true},
  firstname: Sequelize.STRING,
  lastname: Sequelize.STRING,
  email: Sequelize.STRING,
  pass: Sequelize.STRING,
})


User.findAll({ attributes: ['firstname', 'lastname', 'email', 'pass'] })
  .then(users => {
    console.log(users);

  })
  .catch(err => {
    console.log(err)
  })

我得到:
Connected [ users {
    dataValues:
     { firstname: 'Jhon',
       lastname: 'Constantine',
       email: 'jhon@constantine.com',
       pass: 'secretpassword' },

如何访问一个字段?举个例子
console.log(users.firstname);

或者
console.log(users[firstname]);

没用

最佳答案

访问自身返回的对象的属性没有什么特别之处,只是 users 返回的 findAll() 本质上是一个 Array ,您需要对其进行迭代以返回每个结果:

let users = await User.findAll();

for ( let user of users ) {
  log(`${user.firstname} ${user.email}`);
}

因此,当您实际上打算返回多个结果时,您可以使用它。如果您的意思是“一个”,那么您可以使用 findByPk() 通过主键找到:
let bill = await User.findByPk(1);
log(`${bill.firstname} ${bill.lastname}`);

或者使用 findOne() 查询条件:
let ted = await User.findOne({ where: { firstname: 'Ted' } });
log(`${ted.firstname} ${ted.lastname}`);

在任何一种情况下,返回的对象都是单一的,而不是在数组内,因为它会像使用期望返回列表的方法那样。因此,只要您使用正确的方法只返回一个对象,就可以像预期的那样访问属性。

请参阅下面的完整列表,了解这些语句如何在上下文中起作用。

现代异步/等待
const { Op, SMALLINT, STRING } = Sequelize = require('sequelize');

const logging = log = data => console.log(JSON.stringify(data, undefined, 2));
const sequelize = new Sequelize('sqlite:dbname.db', { logging });

const User = sequelize.define('users', {
  id: { type: SMALLINT, primaryKey: true },
  firstname: STRING(50),
  lastname: STRING(50),
  email: STRING(50),
  pass: STRING(50)
});

(async function() {

  try {

    await sequelize.authenticate();
    await User.sync({ force: true });

    let result = await sequelize.transaction(transaction =>
      Promise.all(
        [
          [1, 'Bill', 'Preston', 'bill.s@stalyns.org', 'password'],
          [2, 'Ted', 'Logan', 'ted.t@styalyns.org', 'secret']
        ].map(([id, firstname, lastname, email, pass]) =>
          User.create({ id, firstname, lastname, email, pass }, { transaction })
        )
      )
    );

    let users = await User.findAll();

    for ( let user of users ) {
      log(`${user.firstname} ${user.email}`);
    }

    let bill = await User.findByPk(1);
    log(`${bill.firstname} ${bill.lastname}`);

    let ted = await User.findOne({ where: { firstname: 'Ted' } });
    log(`${ted.firstname} ${ted.lastname}`);

  } catch(e) {
    console.error(e)
  } finally {
    process.exit()
  }

})()

普通 promise 链
const { Op, SMALLINT, STRING } = Sequelize = require('sequelize');

const logging = log = data => console.log(JSON.stringify(data, undefined, 2));
const sequelize = new Sequelize('sqlite:dbname.db', { logging });

const User = sequelize.define('users', {
  id: { type: SMALLINT, primaryKey: true },
  firstname: STRING(50),
  lastname: STRING(50),
  email: STRING(50),
  pass: STRING(50)
});


sequelize.authenticate()
  .then(() => User.sync({ force: true }) )
  .then(() => sequelize.transaction(transaction =>
    Promise.all(
      [
        [1, 'Bill', 'Preston', 'bill.s@stalyns.org', 'password'],
        [2, 'Ted', 'Logan', 'ted.t@styalyns.org', 'secret']
      ].map(([id, firstname, lastname, email, pass]) =>
        User.create({ id, firstname, lastname, email, pass }, { transaction })
      )
    )
  ))
  .then(() => User.findAll() )
  .then(users => {
    for ( let user of users ) {
      log(`${user.firstname} ${user.email}`);
    }
  })
  .then(() => User.findByPk(1) )
  .then(bill => log(`${bill.firstname} ${bill.lastname}`) )
  .then(() => User.findOne({ where: { firstname: 'Ted' } }) )
  .then(ted => log(`${ted.firstname} ${ted.lastname}`) )
  .catch(console.error)
  .then(() => process.exit());

样本输出

两个列表创建相同的输出。日志记录已启用,因此您可以看到针对每个操作发送到数据库引擎的 SQL 语句:
"Executing (default): SELECT 1+1 AS result"
"Executing (default): DROP TABLE IF EXISTS `users`;"
"Executing (default): CREATE TABLE IF NOT EXISTS `users` (`id` SMALLINT PRIMARY KEY, `firstname` VARCHAR(50), `lastname` VARCHAR(50), `email` VARCHAR(50), `pass` VARCHAR(50), `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL);"
"Executing (default): PRAGMA INDEX_LIST(`users`)"
"Executing (default): PRAGMA INDEX_INFO(`sqlite_autoindex_users_1`)"
"Executing (9218ce2c-7c99-4b3a-ac48-9ae5f1d832d4): BEGIN DEFERRED TRANSACTION;"
"Executing (9218ce2c-7c99-4b3a-ac48-9ae5f1d832d4): INSERT INTO `users` (`id`,`firstname`,`lastname`,`email`,`pass`,`createdAt`,`updatedAt`) VALUES (1,'Bill','Preston','bill.s@stalyns.org','password','2018-11-24 04:09:00.628 +00:00','2018-11-24 04:09:00.628 +00:00');"
"Executing (9218ce2c-7c99-4b3a-ac48-9ae5f1d832d4): INSERT INTO `users` (`id`,`firstname`,`lastname`,`email`,`pass`,`createdAt`,`updatedAt`) VALUES (2,'Ted','Logan','ted.t@styalyns.org','secret','2018-11-24 04:09:00.629 +00:00','2018-11-24 04:09:00.629 +00:00');"
"Executing (9218ce2c-7c99-4b3a-ac48-9ae5f1d832d4): COMMIT;"
"Executing (default): SELECT `id`, `firstname`, `lastname`, `email`, `pass`, `createdAt`, `updatedAt` FROM `users` AS `users`;"
"Bill bill.s@stalyns.org"
"Ted ted.t@styalyns.org"
"Executing (default): SELECT `id`, `firstname`, `lastname`, `email`, `pass`, `createdAt`, `updatedAt` FROM `users` AS `users` WHERE `users`.`id` = 1;"
"Bill Preston"
"Executing (default): SELECT `id`, `firstname`, `lastname`, `email`, `pass`, `createdAt`, `updatedAt` FROM `users` AS `users` WHERE `users`.`firstname` = 'Ted' LIMIT 1;"
"Ted Logan"

关于node.js - 访问 Sequelize 模型上的单个字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53454841/

相关文章:

javascript - Node.js 触发回调两次,为什么?

javascript - foreach 内的 mongoose find()

javascript - lodash 合并和组合对象

node.js - Sequelize ORM 异步方法调用

node.js - 使用sequelize.js 检查记录/模型是否唯一

node.js - Socket.io pinginterval 对服务器性能的影响

node.js - MongoDB - 如何使用 Node.js 获取集合的大小?

node.js - 嵌套 .then() 并捕获 Javascript promise

sequelize.js - Sequelize - 如何设置外键并加入它

node.js - npm install 是否排除开发依赖?