【问题标题】:PSQL nodejs variable undefinedPSQL nodejs变量未定义
【发布时间】:2017-08-03 13:17:19
【问题描述】:

我从数据库中获取所有文章的功能有问题。

文章数据库: 编号 |标题 |价格 |说明

图像数据库: 编号 |文章ID |名字

当我记录数据“文章”时,它是未定义的。

client.query('SELECT * FROM articles', function (err, result) {
        if (err) throw err;

        if (result.rowCount != 0) {
            var articles = [];
            result.rows.forEach(function (entry) {
                client.query('SELECT name FROM images WHERE articleid = $1', [entry.id], function (err, result) {
                    if (err) throw err;

                    var article = [];
                    var images = [];

                    result.rows.forEach(function (entry) {
                        images.push(entry.name);
                    });

                    article = entry;
                    article.images = images;

                    articles.push(article);

                });
            });
            console.log(articles);
            res.send(articles);
        }

        res.send();
    });

【问题讨论】:

  • 你最好在 select 中加入两个表,然后在 js 中循环它我想像SELECT a.*,i.name FROM articles a join images i on i.articleid = a.id
  • 是的,这就是我想要做的

标签: sql node.js database postgresql


【解决方案1】:

我建议您使用 Sequelize 作为应用程序的 ORM,因为它可以轻松处理您的数据库,甚至可以让您直接查询数据库:

例如,您需要为数据库中的每个表定义一个类:

models/article.js

var Article  = sequelize.define("Article", {
  id: { type: DataTypes.INTEGER, primaryKey: true},
  name: { type: DataTypes.STRING, name: 'name' },
  ...
}, {
  classMethods: {
    associate: function(models) {
      Article.hasMany(models.Image);
    }
  }
});

请注意,您定义了与 Image 表的一对多关系。

models/image.js

var Image = sequelize.define("Image", {
  id: { type: DataTypes.INTEGER, primaryKey: true},
  url: { type: DataTypes.STRING, name: 'name' },
  ...
}, {
  classMethods: {
    associate: function(models) {
      Image.belogsTo(models.Article);
    }
  }
});

请注意,您指出与文章的一对一关系。

最后,您可以使用上面的类来查询您的数据库:

app.get(function(req, res, next) {
  models.Article
  .findAll({
      includes: [{
        model: models.Image
      }]
  })
  .then(function(articles) {
    res.json(articles);
  });
});

在这种情况下,您查询所有文章并包含属于该文章的图像列表。

您甚至可以按照下一个语法运行普通查询:

var queryString = 'select * from Article a join Image i on a.id = i.articleId where articleId = :articleId';

models.sequelize
  .query(queryString, {
    replacements: { articleId: req.params.id },
    type: models.sequelize.QueryTypes.SELECT
  })
  .then(function(articles) {
    res.json(articles)
  });

您可以在此处找到如何在项目中配置 sequelize 的示例:http://docs.sequelizejs.com/en/1.7.0/articles/express/

【讨论】:

    猜你喜欢
    • 2018-06-29
    • 2023-03-14
    • 2018-05-29
    • 1970-01-01
    • 2016-07-31
    • 2020-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多