Javascript pg promise,将命名参数与嵌套对象一起使用

Javascript pg promise,将命名参数与嵌套对象一起使用,javascript,named-parameters,pg-promise,Javascript,Named Parameters,Pg Promise,使用命名参数时,是否可以引用嵌套对象,如以下示例所示 var obj = { name: 'John', address: { postcode: 'abc' } }; db.query('SELECT * FROM users WHERE postcode=${address.postcode} AND name=${name}', obj); 目前,对嵌套对象的引用未使用值解析,例如,${address.postcode}保持原样,并且在查询字符串

使用命名参数时,是否可以引用嵌套对象,如以下示例所示

var obj = {
    name: 'John',
    address: {
        postcode: 'abc'
    }
};

db.query('SELECT * FROM users WHERE postcode=${address.postcode} AND name=${name}', obj);

目前,对嵌套对象的引用未使用值解析,例如,
${address.postcode}
保持原样,并且在查询字符串中未替换为
'abc'

注意:此答案自年起不再有效,从年开始本机支持

问题中提供的代码示例将按原样工作


仅适用于之前的

该库只格式化命名参数,不计算它们,因此不,您不能这样做,至少不能直接这样做

但您可以通过以下函数使子属性可用于查询格式引擎:

var obj = {
    name: 'John',
    address: {
        postcode: 'abc'
    },
    addrCode: a => a.address.postcode // alias for accessing a sub-property
};
然后使用
其中postcode=${addrCode}

而较旧的/ES5语法,通过
this
也可以:

var obj = {
    name: 'John',
    address: {
        postcode: 'abc'
    },
    addrCode: function(/*a*/) {
        // a = this (can use both)
        return this.address.postcode;
    }
};
更新

可以进行客户端评估,但只能使用
$1,$2,…
参数:

db.query('... postcode = $1 AND name = $2', [obj.name, obj.address.postcode]);

注意:您不能直接在查询字符串中使用像
${obj.address.postcode}
这样的求值,因为该值不会正确转义。

谢谢@vitaly-t。那么,评估是在数据库级别进行的吗?@arm5472该库从不进行任何评估,所以我不知道你的意思。当您使用命名参数时,库的查询格式引擎将插入所有值。当我使用记录查询时,查询属性将显示
${name}
在进入数据库之前被
'John'
替换:
选择*FROM users WHERE postcode=${address.postcode}而name='John'
评估仅在特定情况下在服务器上进行:a)准备好的陈述;b) 用于参数化查询。在所有这些情况下,您只能访问
$1,$2,…
变量语法,但不能访问命名参数。答案已更新。该库支持嵌套属性,因为。