gpt4 book ai didi

javascript - 如何使用 Node.js 从带有关联的 Sequelize 查询中打印顺序数据?

转载 作者:行者123 更新时间:2023-12-03 22:39:46 25 4
gpt4 key购买 nike

我正在尝试从演示 Node.js 应用程序和 Sequelize 获得一个简单的顺序输出,但我似乎无法理解 promise 和 Bluebird 以及它们如何帮助我。我追求的输出是这样的:

User: John Doe
Project: "Acme Website": Sample project
Project: "PMC Website": Sample project

Total projects: 2

User: Jane Doe
Project: "ABC Website": Sample project

Total projects: 1

User: Jill Doe
No projects

Total users: 3

我没有使用 Express。这只是一个演示应用程序来弄清楚所有这些事情。

这是我的 User 模型:
// models/user.js
'use strict';
module.exports = (sequelize, DataTypes) => {
var User = sequelize.define('User', {
firstName: DataTypes.STRING,
lastName: DataTypes.STRING,
email: DataTypes.STRING
}, {});
User.associate = function(models) {
// associations can be defined here
User.hasMany(models.Project);
};
return User;
};

这是我的 Project 模型:
// models/project.js
'use strict';
module.exports = (sequelize, DataTypes) => {
var Project = sequelize.define('Project', {
title: DataTypes.STRING,
description: DataTypes.TEXT
}, {});
Project.associate = function(models) {
// associations can be defined here
Project.belongsTo(models.User);
};
return Project;
};

我写的代码不起作用,显然:
User.findAndCountAll().then((result) => {
if (result.count > 0) {
let users = result.rows;

users.forEach((user, index, arr) => {
console.log('User: ' + user.firstName + ' ' + user.lastName + ' <' + user.email + '>' + '\n' );
user.getProjects().then((projects) => {
projects.forEach((project, index, arr) => {
console.log('\tProject: "' + project.title + '": ' + project.description + '\n');
});
}).then((projects) => {
console.log('\tTotal projects: xxx'); // xxx should be the count
});
}
);

console.log('Total users: ' + result.count);
} else {
console.log('No users');
}
});

我知道我需要使用 Promise,但我不知道在哪里或如何使用。我看过一些带有回调和 setTimeout 的教程,但我认为我应该远离那些,对吧?

我不想简单地构造一个数组或值对象,然后在最后输出它,因为它不能解决我无法理解 promise 是如何工作的问题。

编辑:我不确定我是否在问正确的问题,甚至。我试图通过尝试同步示例来理解异步,但这可能不是解决问题的方法。我想答案在于如果我希望使用像 JavaScript 这样的异步平台,我不应该人为地强加类似同步的等待时间。相反,如果我们考虑上面的例子,运行结果并将数据收集到一个对象中,然后输出它可能是一个更好的主意。或者,下面@Priyank 建议的方法(固定和修改)会给我确切的输出:
User.findAndCountAll({
include:[
Project
]
}).then(result => {
result.rows.forEach((user, index, arr) => {
console.log('User: ' + user.firstName + ' ' + user.lastName + ' <' + user.email + '>');

user.Projects.forEach((project, index, arr) => {
console.log('\tProject: "' + project.title + '": ' + project.description);
});

console.log('\n\tTotal projects: ' + user.Projects.length + '\n');
});

console.log('\nTotal users: ' + result.count + '\n');
}).finally(() => {
process.exit();
});

虽然这确实给了我预期的输出,但我相信我一直在尝试用 JavaScript 解决错误的问题。因此,我不想将该答案标记为已接受,因为我的错误问题没有正确答案。

最佳答案

使用以下代码更改您的代码并检查。

User.findAndCountAll({
include:{
model:model.project // your project model
}
}).then( result => {
console.log( "result=====>",result);
result.forEach((user, index, arr) => {
console.log('User: ' + user.firstName + ' ' + user.lastName + ' <' + user.email + '>' + '\n' );
user.project.forEach((projects, index, arr) => {
console.log('\tProject: "' + project.title + '": ' + project.description + '\n');
});
}
});

Document

检查您的控制台并相应地打印数据。

关于javascript - 如何使用 Node.js 从带有关联的 Sequelize 查询中打印顺序数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50855443/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com