javascript – pg-promise:将函数作为参数传递给func()
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript – pg-promise:将函数作为参数传递给func(),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1584字,纯文字阅读大概需要3分钟。
内容图文
![javascript – pg-promise:将函数作为参数传递给func()](/upload/InfoBanner/zyjiaocheng/820/64dacba8284c4ed3a60b9ce376c67056.jpg)
我使用pg-promise访问我们的postgres数据库.我想调用接受几何数据类型(PostGIS)的存储proc foo(geom).我只有lats / lngs开头,所以我想用postGIS转换它们.
这看起来像这样:
db.func('foo', 'ST_MakePoint(' + location.lat + ', ' + location.lng + ')')
.then((result) => {
console.log(bar);
});
我现在收到一个错误,抱怨我的几何体无效(转换不会发生).我确信ST_MakePoint适用于我拥有的值.我猜它在数据库上执行时将其解释为字符串而不是函数调用.
我应该如何传递此参数才能使其正常工作?
解决方法:
我是pg-promise的作者;)
与使用pg-promise的常规查询格式(通过格式化变量指定格式化模板)不同,在使用方法func和proc时会跳过该格式,因此它们是从值的类型中隐含的.
最优雅的解决方案是使用库支持的Custom Type Formatting,它允许您覆盖任何数据类型并提供自己的格式.
你可以像这样介绍你自己的类Point:
function Point(lat, lng) {
this.lat = +lat;
this.lng = +lng;
this.rawType = true; /* use as raw/unescaped value */
this.toPostgres = p => {
return 'ST_MakePoint(' + p.lat + ',' + p.lng + ')';
};
}
然后你可以将它作为常规值传递:
const p = new Point(1, 2);
db.func('foo', r).then(...)
或者,您可以直接执行查询.不要高估方法func,它只是执行SELECT * FROM foo,所以你可以这样做:
const p = 'ST_MakePoint(' + lat + ',' + lng + ')';
db.any('SELECT * FROM foo($1:raw)', p).then(...)
:raw – 注入raw / unescaped值.
附:将来,不要猜测pg-promise执行什么,而是尝试pg-monitor,或者至少处理event query.
更新:29/04/2018
更新了Custom Type Formatting的语法以遵守pg-promise支持的最新版本.
用于包含点的最短语法:
const point = (lat, lng) => ({
toPostgres: ()=> pgp.as.format('ST_MakePoint($1, $2)', [lat, lng]),
rawType: true
});
所以你可以简单地传递它:
db.func('foo', point(1, 2))
内容总结
以上是互联网集市为您收集整理的javascript – pg-promise:将函数作为参数传递给func()全部内容,希望文章能够帮你解决javascript – pg-promise:将函数作为参数传递给func()所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。