【问题标题】:StrongLoop query/stored procedure with Postgres?使用 Postgres 的 StrongLoop 查询/存储过程?
【发布时间】:2016-02-25 06:14:20
【问题描述】:

根据文档,StrongLoop 不支持运行自定义 sql 语句。 https://docs.strongloop.com/display/public/LB/Executing+native+SQL

任何人都认为您可以通过简单的联接来构建企业应用程序,这超出了我的理解,但我确实找到了这篇文章,上面说您可以做到: Execute raw query on MySQL Loopback Connector

但这是针对 MySql 的。当我尝试使用 Postgres 时,我收到错误消息:“'object' 类型的参数 'byId' 的值无效:0。接收的类型已转换为数字。”它不返回任何数据。这是我的代码:

module.exports = function(account) {

account.byId = function(byId, cb){
    var ds=account.dataSource;
    var sql = "SELECT * FROM account where id > ?";
    ds.connector.execute(sql, [Number(byId)], function(err, accounts)    {
        if (err) console.error(err);
        console.info(accounts);
        cb(err, accounts);
    });
};
account.remoteMethod(
    'byId',
    {
        http: {verb: 'get'},
        description: "Get accounts greater than id",
        accepts: {arg: 'byId', type: 'integer'},
        returns: {arg: 'data', type: ['account'], root: true}
    }
);
};

对于 [Number(byId)] 部分,我也尝试过 [byId] 和只是 byId。没有任何效果。

有什么想法吗?到目前为止,我真的很喜欢 StrongLoop,但看起来 Postgresql 连接器还没有准备好投入生产。如果这不起作用,我接下来会用 Sails 做一个原型。 :-(

【问题讨论】:

  • 经过进一步测试,这可能是 StrongLoop Explorer 无法正确解析整数的错误。此错误仅在我使用整数时发生,如果我将其更改为字符串,它就会消失。但随后我收到错误“错误:绑定消息提供 1 个参数,但准备好的语句 \"\" 需要 0”。我明天需要在不使用 API Explorer 的情况下进行测试。
  • 我发现这适用于 MySql。它适用于数字和字符串。让它与 Postgresql 一起工作的唯一方法是从头开始构建一个 sql 字符串(将值连接到字符串中,而不让 StrongLoop 为我做参数)。请注意,您必须编写自己的代码以防止 sql 注入。还有一件事,我查看了 StrongLoop 库的源代码,它们也没有阻止 sql 注入。他们只是遍历参数并将值插入到 sql 字符串中。非常糟糕的做法。

标签: postgresql loopbackjs strongloop


【解决方案1】:

arg 的类型为“整数”,它不是有效的 Loopback Type。请改用“数字”。检查以下更正后的代码:

module.exports = function(account) {
    account.byId = function(byId, cb){
        var ds = account.dataSource;
        var sql = "SELECT * FROM account WHERE id > $1";
        ds.connector.execute(sql, byId, function(err, accounts) {
            if (err) console.error(err);
            console.info(accounts);
            cb(err, accounts);
        });
    };
    account.remoteMethod(
        'byId',
        {
            http: {verb: 'get'},
            description: "Get accounts greater than id",
            accepts: {arg: 'byId', type: 'Number'},
            returns: {arg: 'data', type: ['account'], root: true}    //here 'account' will be treated as 'Object'.
        }
    );
};

注意: MySQL的prepared statements原生使用?作为参数占位符,但PostgreSQL使用$1, @987654328 @等

希望这对你有用。或者按照docs 尝试使用[byId] 而不是byId。

【讨论】:

  • 感谢您提供指向 Loopback Connector 文档的链接。我没有看到,我一直在引用主要的 StrongLoop 文档。我将它切换为 Number(以及 [byId]),现在它给了我错误“输入末尾的语法错误”。
  • 请参阅我上面的评论,您的答案适用于 MySql,但不适用于 Postgre。我认为 postgre 库有问题。
  • 您好,请在stackoverflow.com/questions/13119786/… 上提交此问题。我发现postgresql的占位符需要从?改为$1。让我在答案中说明这一点。
猜你喜欢
  • 2021-01-01
  • 2022-01-17
  • 1970-01-01
  • 2016-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-09
  • 1970-01-01
相关资源
最近更新 更多